From 2df5feab2662b3809f4ed09f8470184cdd7a089c Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 28 Jan 2023 13:59:54 +0100 Subject: [PATCH] Adds HealEachEndOfTurn effect, move common usings for scripts to separate file --- gen_7_scripts/src/common_usings.rs | 12 +++++ gen_7_scripts/src/lib.rs | 1 + gen_7_scripts/src/moves/acrobatics.rs | 5 +- gen_7_scripts/src/moves/acupressure.rs | 4 +- gen_7_scripts/src/moves/after_you.rs | 4 +- gen_7_scripts/src/moves/assist.rs | 5 +- gen_7_scripts/src/moves/assurance.rs | 9 +--- gen_7_scripts/src/moves/attract.rs | 5 +- gen_7_scripts/src/moves/aurora_veil.rs | 13 ++--- gen_7_scripts/src/moves/automize.rs | 5 +- .../src/moves/change_all_target_stats.rs | 10 +--- .../src/moves/change_target_stats.rs | 9 +--- gen_7_scripts/src/moves/cure_party_status.rs | 5 +- gen_7_scripts/src/moves/drain.rs | 9 +--- gen_7_scripts/src/moves/flinch.rs | 6 +-- .../src/moves/heal_each_end_of_turn.rs | 53 +++++++++++++++++++ gen_7_scripts/src/moves/mod.rs | 1 + gen_7_scripts/src/moves/multi_hit_move.rs | 4 +- gen_7_scripts/src/moves/struggle.rs | 21 ++++---- .../src/pokemon/heal_each_end_of_turn.rs | 38 +++++++++++++ gen_7_scripts/src/pokemon/infatuated.rs | 5 +- gen_7_scripts/src/pokemon/mod.rs | 1 + gen_7_scripts/src/registered_scripts.rs | 16 ++++-- .../src/util_scripts/force_effect_trigger.rs | 4 +- gen_7_scripts/src/utils/mod.rs | 6 +-- gen_7_scripts/src/weather/hail.rs | 5 +- pkmn_lib_interface/src/handling/mod.rs | 1 + pkmn_lib_interface/src/handling/script.rs | 1 + 28 files changed, 153 insertions(+), 105 deletions(-) create mode 100644 gen_7_scripts/src/common_usings.rs create mode 100644 gen_7_scripts/src/moves/heal_each_end_of_turn.rs create mode 100644 gen_7_scripts/src/pokemon/heal_each_end_of_turn.rs diff --git a/gen_7_scripts/src/common_usings.rs b/gen_7_scripts/src/common_usings.rs new file mode 100644 index 0000000..582619f --- /dev/null +++ b/gen_7_scripts/src/common_usings.rs @@ -0,0 +1,12 @@ +pub use crate::script; +pub use alloc::boxed::Box; +pub use alloc::rc::Rc; +pub use atomic_float::AtomicF32; +pub use core::any::Any; +pub use core::sync::atomic::{AtomicBool, AtomicI8, AtomicU32, Ordering}; +pub use pkmn_lib_interface::app_interface::list::ImmutableList; +pub use pkmn_lib_interface::app_interface::{ + get_volatile_as, BattleSide, DamageSource, DynamicLibrary, EffectParameter, ExecutingMove, + Gender, MoveCategory, MoveData, Party, Pokemon, Statistic, StringKey, TurnChoice, +}; +pub use pkmn_lib_interface::handling::{Script, ScriptCapabilities, ScriptOwner}; diff --git a/gen_7_scripts/src/lib.rs b/gen_7_scripts/src/lib.rs index 1678d46..1a4df95 100755 --- a/gen_7_scripts/src/lib.rs +++ b/gen_7_scripts/src/lib.rs @@ -15,6 +15,7 @@ use pkmn_lib_interface::set_load_script_fn; #[macro_use] pub mod registered_scripts; +pub(crate) mod common_usings; pub mod moves; pub mod pokemon; pub mod util_scripts; diff --git a/gen_7_scripts/src/moves/acrobatics.rs b/gen_7_scripts/src/moves/acrobatics.rs index 0cd9fec..e3b07c4 100755 --- a/gen_7_scripts/src/moves/acrobatics.rs +++ b/gen_7_scripts/src/moves/acrobatics.rs @@ -1,7 +1,4 @@ -use crate::script; -use core::any::Any; -use pkmn_lib_interface::app_interface::{ExecutingMove, Pokemon}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!(Acrobatics, "acrobatics"); diff --git a/gen_7_scripts/src/moves/acupressure.rs b/gen_7_scripts/src/moves/acupressure.rs index 98649bb..9aeb026 100755 --- a/gen_7_scripts/src/moves/acupressure.rs +++ b/gen_7_scripts/src/moves/acupressure.rs @@ -1,7 +1,5 @@ -use core::any::Any; +use crate::common_usings::*; use core::mem::transmute; -use pkmn_lib_interface::app_interface::{ExecutingMove, Pokemon, Statistic}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; pub struct Acupressure {} diff --git a/gen_7_scripts/src/moves/after_you.rs b/gen_7_scripts/src/moves/after_you.rs index 144c457..3655a7d 100755 --- a/gen_7_scripts/src/moves/after_you.rs +++ b/gen_7_scripts/src/moves/after_you.rs @@ -1,6 +1,4 @@ -use core::any::Any; -use pkmn_lib_interface::app_interface::{ExecutingMove, Pokemon}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; pub struct AfterYou {} diff --git a/gen_7_scripts/src/moves/assist.rs b/gen_7_scripts/src/moves/assist.rs index ecd6005..8b44385 100755 --- a/gen_7_scripts/src/moves/assist.rs +++ b/gen_7_scripts/src/moves/assist.rs @@ -1,8 +1,5 @@ -use crate::script; +use crate::common_usings::*; use alloc::vec::Vec; -use core::any::Any; -use pkmn_lib_interface::app_interface::{MoveData, Party, Pokemon, StringKey, TurnChoice}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; script!(Assist, "assist"); diff --git a/gen_7_scripts/src/moves/assurance.rs b/gen_7_scripts/src/moves/assurance.rs index 8fa4e3c..d22a6a7 100755 --- a/gen_7_scripts/src/moves/assurance.rs +++ b/gen_7_scripts/src/moves/assurance.rs @@ -1,11 +1,4 @@ -use crate::script; -use alloc::boxed::Box; -use core::any::Any; -use core::sync::atomic::{AtomicBool, Ordering}; -use pkmn_lib_interface::app_interface::{ - get_volatile_as, BattleSide, DamageSource, ExecutingMove, Pokemon, TurnChoice, -}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!(Assurance, "assurance"); diff --git a/gen_7_scripts/src/moves/attract.rs b/gen_7_scripts/src/moves/attract.rs index 4039e57..cfef919 100644 --- a/gen_7_scripts/src/moves/attract.rs +++ b/gen_7_scripts/src/moves/attract.rs @@ -1,8 +1,5 @@ +use crate::common_usings::*; use crate::pokemon::infatuated::Infatuated; -use crate::script; -use core::any::Any; -use pkmn_lib_interface::app_interface::{ExecutingMove, Gender, Pokemon}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; script!(Attract, "attract"); diff --git a/gen_7_scripts/src/moves/aurora_veil.rs b/gen_7_scripts/src/moves/aurora_veil.rs index 261494a..59de72d 100644 --- a/gen_7_scripts/src/moves/aurora_veil.rs +++ b/gen_7_scripts/src/moves/aurora_veil.rs @@ -1,13 +1,7 @@ +use crate::common_usings::*; 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::{ExecutingMove, MoveCategory, Pokemon}; -use pkmn_lib_interface::handling::ScriptCapabilities::OnEndTurn; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; script!(AuroraVeil, "aurora_veil"); @@ -60,7 +54,10 @@ impl Script for AuroraVeilEffect { } fn get_capabilities(&self) -> &[ScriptCapabilities] { - &[ScriptCapabilities::ChangeIncomingDamage, OnEndTurn] + &[ + ScriptCapabilities::ChangeIncomingDamage, + ScriptCapabilities::OnEndTurn, + ] } fn change_incoming_damage( diff --git a/gen_7_scripts/src/moves/automize.rs b/gen_7_scripts/src/moves/automize.rs index 0db06f4..55d04b8 100644 --- a/gen_7_scripts/src/moves/automize.rs +++ b/gen_7_scripts/src/moves/automize.rs @@ -1,7 +1,4 @@ -use crate::script; -use core::any::Any; -use pkmn_lib_interface::app_interface::{ExecutingMove, Pokemon, Statistic}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!(Automize, "automize"); diff --git a/gen_7_scripts/src/moves/change_all_target_stats.rs b/gen_7_scripts/src/moves/change_all_target_stats.rs index 9d53159..7e33639 100644 --- a/gen_7_scripts/src/moves/change_all_target_stats.rs +++ b/gen_7_scripts/src/moves/change_all_target_stats.rs @@ -1,12 +1,4 @@ -use crate::script; -use alloc::rc::Rc; -use core::any::Any; -use core::sync::atomic::{AtomicI8, Ordering}; -use pkmn_lib_interface::app_interface::list::ImmutableList; -use pkmn_lib_interface::app_interface::{ - DynamicLibrary, EffectParameter, ExecutingMove, Pokemon, Statistic, -}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!( ChangeAllTargetStats, diff --git a/gen_7_scripts/src/moves/change_target_stats.rs b/gen_7_scripts/src/moves/change_target_stats.rs index 0154e82..a7e83c2 100644 --- a/gen_7_scripts/src/moves/change_target_stats.rs +++ b/gen_7_scripts/src/moves/change_target_stats.rs @@ -1,11 +1,4 @@ -use alloc::rc::Rc; -use core::any::Any; -use core::sync::atomic::{AtomicI8, Ordering}; -use pkmn_lib_interface::app_interface::list::ImmutableList; -use pkmn_lib_interface::app_interface::{ - DynamicLibrary, EffectParameter, ExecutingMove, Pokemon, Statistic, -}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; macro_rules! change_stat_effect { ( diff --git a/gen_7_scripts/src/moves/cure_party_status.rs b/gen_7_scripts/src/moves/cure_party_status.rs index 55bec92..b095ffb 100644 --- a/gen_7_scripts/src/moves/cure_party_status.rs +++ b/gen_7_scripts/src/moves/cure_party_status.rs @@ -1,7 +1,4 @@ -use crate::script; -use core::any::Any; -use pkmn_lib_interface::app_interface::{ExecutingMove, Pokemon}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!(CurePartyStatus, "cure_party_status"); diff --git a/gen_7_scripts/src/moves/drain.rs b/gen_7_scripts/src/moves/drain.rs index c6a31ea..ff66e2a 100644 --- a/gen_7_scripts/src/moves/drain.rs +++ b/gen_7_scripts/src/moves/drain.rs @@ -1,11 +1,4 @@ -use crate::script; -use alloc::rc::Rc; -use atomic_float::AtomicF32; -use core::any::Any; -use core::sync::atomic::Ordering; -use pkmn_lib_interface::app_interface::list::ImmutableList; -use pkmn_lib_interface::app_interface::{DynamicLibrary, EffectParameter, ExecutingMove, Pokemon}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!(Drain, "drain", heal_modifier: AtomicF32); diff --git a/gen_7_scripts/src/moves/flinch.rs b/gen_7_scripts/src/moves/flinch.rs index f4c71f3..b448153 100644 --- a/gen_7_scripts/src/moves/flinch.rs +++ b/gen_7_scripts/src/moves/flinch.rs @@ -1,8 +1,4 @@ -use crate::script; -use alloc::boxed::Box; -use core::any::Any; -use pkmn_lib_interface::app_interface::{ExecutingMove, Pokemon}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!(Flinch, "flinch"); diff --git a/gen_7_scripts/src/moves/heal_each_end_of_turn.rs b/gen_7_scripts/src/moves/heal_each_end_of_turn.rs new file mode 100644 index 0000000..1442b71 --- /dev/null +++ b/gen_7_scripts/src/moves/heal_each_end_of_turn.rs @@ -0,0 +1,53 @@ +use crate::common_usings::*; +use crate::pokemon::heal_each_end_of_turn::HealEachEndOfTurnEffect; + +script!( + HealEachEndOfTurn, + "heal_each_end_of_turn", + heal_percent: AtomicF32 +); + +impl Script for HealEachEndOfTurn { + fn new() -> Self { + Self { + heal_percent: Default::default(), + } + } + + fn get_name(&self) -> &'static str { + Self::get_const_name() + } + + fn get_capabilities(&self) -> &[ScriptCapabilities] { + &[ + ScriptCapabilities::Initialize, + ScriptCapabilities::OnSecondaryEffect, + ] + } + + fn on_initialize( + &self, + _library: DynamicLibrary, + parameters: Option>>, + ) { + self.heal_percent.store( + parameters.unwrap().get(0).unwrap().as_float() / 100.0, + Ordering::SeqCst, + ); + } + + fn on_secondary_effect(&self, _mv: ExecutingMove, target: Pokemon, _hit: u8) { + let script = target.add_volatile_by_name("heal_each_end_of_turn_effect"); + let amount = self.heal_percent.load(Ordering::SeqCst); + script + .as_any() + .downcast_ref::() + .unwrap() + .heal_percent + .store(amount, Ordering::SeqCst); + } + + fn as_any(&self) -> &dyn Any { + self + } +} diff --git a/gen_7_scripts/src/moves/mod.rs b/gen_7_scripts/src/moves/mod.rs index 70b6e3a..b7ddaa9 100755 --- a/gen_7_scripts/src/moves/mod.rs +++ b/gen_7_scripts/src/moves/mod.rs @@ -15,3 +15,4 @@ pub mod light_screen; pub mod multi_hit_move; pub mod reflect; pub mod struggle; +pub mod heal_each_end_of_turn; diff --git a/gen_7_scripts/src/moves/multi_hit_move.rs b/gen_7_scripts/src/moves/multi_hit_move.rs index d3d96cb..178c180 100755 --- a/gen_7_scripts/src/moves/multi_hit_move.rs +++ b/gen_7_scripts/src/moves/multi_hit_move.rs @@ -1,6 +1,4 @@ -use core::any::Any; -use pkmn_lib_interface::app_interface::TurnChoice; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; pub struct MultiHitMove {} diff --git a/gen_7_scripts/src/moves/struggle.rs b/gen_7_scripts/src/moves/struggle.rs index 3e51262..9a93ef8 100644 --- a/gen_7_scripts/src/moves/struggle.rs +++ b/gen_7_scripts/src/moves/struggle.rs @@ -1,7 +1,4 @@ -use crate::script; -use core::any::Any; -use pkmn_lib_interface::app_interface::{DamageSource, ExecutingMove, Pokemon, TurnChoice}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!(Struggle, "struggle"); @@ -23,6 +20,14 @@ impl Script for Struggle { ] } + fn change_number_of_hits(&self, _choice: TurnChoice, number_of_hits: &mut u8) { + *number_of_hits = 1 + } + + fn is_invulnerable(&self, _move: ExecutingMove, _target: Pokemon, invulnerable: &mut bool) { + *invulnerable = false; + } + fn change_effectiveness( &self, _move: ExecutingMove, @@ -33,14 +38,6 @@ impl Script for Struggle { *effectiveness = 1.0; } - fn is_invulnerable(&self, _move: ExecutingMove, _target: Pokemon, invulnerable: &mut bool) { - *invulnerable = false; - } - - fn change_number_of_hits(&self, _choice: TurnChoice, number_of_hits: &mut u8) { - *number_of_hits = 1 - } - fn on_secondary_effect(&self, mv: ExecutingMove, _target: Pokemon, _hit: u8) { let mut damage = mv.user().max_health() / 4; if damage == 0 { diff --git a/gen_7_scripts/src/pokemon/heal_each_end_of_turn.rs b/gen_7_scripts/src/pokemon/heal_each_end_of_turn.rs new file mode 100644 index 0000000..7073bac --- /dev/null +++ b/gen_7_scripts/src/pokemon/heal_each_end_of_turn.rs @@ -0,0 +1,38 @@ +use crate::common_usings::*; + +script!( + HealEachEndOfTurnEffect, + "heal_each_end_of_turn_effect", + pub heal_percent: AtomicF32 +); + +impl Script for HealEachEndOfTurnEffect { + fn new() -> Self { + Self { + heal_percent: Default::default(), + } + } + + fn get_name(&self) -> &'static str { + Self::get_const_name() + } + + fn get_capabilities(&self) -> &[ScriptCapabilities] { + &[ScriptCapabilities::OnEndTurn] + } + + fn on_end_turn(&self) { + if let Some(ScriptOwner::Pokemon(pokemon)) = self.get_owner() { + let mut amount = + pokemon.max_health() as f32 * self.heal_percent.load(Ordering::Relaxed); + if pokemon.has_held_item("big_root") { + amount *= 1.3; + } + pokemon.heal(amount as u32, false); + } + } + + fn as_any(&self) -> &dyn Any { + self + } +} diff --git a/gen_7_scripts/src/pokemon/infatuated.rs b/gen_7_scripts/src/pokemon/infatuated.rs index 8b4fa96..af321fb 100644 --- a/gen_7_scripts/src/pokemon/infatuated.rs +++ b/gen_7_scripts/src/pokemon/infatuated.rs @@ -1,7 +1,4 @@ -use crate::script; -use core::any::Any; -use pkmn_lib_interface::app_interface::ExecutingMove; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; script!(Infatuated, "infatuated"); diff --git a/gen_7_scripts/src/pokemon/mod.rs b/gen_7_scripts/src/pokemon/mod.rs index cf0a17b..4bbe169 100644 --- a/gen_7_scripts/src/pokemon/mod.rs +++ b/gen_7_scripts/src/pokemon/mod.rs @@ -1 +1,2 @@ +pub mod heal_each_end_of_turn; pub mod infatuated; diff --git a/gen_7_scripts/src/registered_scripts.rs b/gen_7_scripts/src/registered_scripts.rs index f0e8f39..f0cc4a3 100755 --- a/gen_7_scripts/src/registered_scripts.rs +++ b/gen_7_scripts/src/registered_scripts.rs @@ -1,4 +1,5 @@ use crate::moves::*; +use crate::pokemon; use crate::pokemon::*; use alloc::boxed::Box; use pkmn_lib_interface::app_interface::{get_hash, StringKey}; @@ -25,14 +26,13 @@ macro_rules! resolve_match { pub fn get_script(category: ScriptCategory, name: &StringKey) -> Option> { match category { ScriptCategory::Move => { - resolve_match!( + resolve_match! { name.hash(), acrobatics::Acrobatics, acupressure::Acupressure, after_you::AfterYou, assist::Assist, assurance::Assurance, - multi_hit_move::MultiHitMove, attract::Attract, aurora_veil::AuroraVeil, automize::Automize, @@ -45,16 +45,22 @@ pub fn get_script(category: ScriptCategory, name: &StringKey) -> Option {} ScriptCategory::Status => {} ScriptCategory::Pokemon => { - resolve_match!(name.hash(), infatuated::Infatuated,) + resolve_match! { + name.hash(), + infatuated::Infatuated, + pokemon::heal_each_end_of_turn::HealEachEndOfTurnEffect, + } } ScriptCategory::Battle => { - resolve_match!(name.hash(), crate::util_scripts::ForceEffectTriggerScript,) + resolve_match! {name.hash(), crate::util_scripts::ForceEffectTriggerScript,} } ScriptCategory::Side => {} ScriptCategory::ItemBattleTrigger => {} diff --git a/gen_7_scripts/src/util_scripts/force_effect_trigger.rs b/gen_7_scripts/src/util_scripts/force_effect_trigger.rs index 696b08f..b881cc1 100755 --- a/gen_7_scripts/src/util_scripts/force_effect_trigger.rs +++ b/gen_7_scripts/src/util_scripts/force_effect_trigger.rs @@ -1,6 +1,4 @@ -use core::any::Any; -use pkmn_lib_interface::app_interface::{ExecutingMove, Pokemon}; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; pub struct ForceEffectTriggerScript {} diff --git a/gen_7_scripts/src/utils/mod.rs b/gen_7_scripts/src/utils/mod.rs index 3cf6585..607f855 100755 --- a/gen_7_scripts/src/utils/mod.rs +++ b/gen_7_scripts/src/utils/mod.rs @@ -1,18 +1,18 @@ pub mod copyable_moves; #[macro_export] -macro_rules! script{ +macro_rules! script { ( $name: ident, $id: literal $( , - $field_name:ident : $field_type:ty + $field_vis:vis $field_name:ident : $field_type:ty )* ) => { pub struct $name { $( - $field_name: $field_type, + $field_vis $field_name: $field_type, )* } diff --git a/gen_7_scripts/src/weather/hail.rs b/gen_7_scripts/src/weather/hail.rs index adae079..c750dc3 100644 --- a/gen_7_scripts/src/weather/hail.rs +++ b/gen_7_scripts/src/weather/hail.rs @@ -1,6 +1,5 @@ -use crate::script; -use core::any::Any; -use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; +use crate::common_usings::*; + script!(Hail, "hail"); impl Script for Hail { diff --git a/pkmn_lib_interface/src/handling/mod.rs b/pkmn_lib_interface/src/handling/mod.rs index 34ffad5..e3d034e 100755 --- a/pkmn_lib_interface/src/handling/mod.rs +++ b/pkmn_lib_interface/src/handling/mod.rs @@ -14,6 +14,7 @@ pub use capabilities::*; #[cfg(not(feature = "mock_data"))] pub(crate) use cacheable::Cacheable; pub use script::Script; +pub use script::ScriptOwner; #[repr(u8)] pub enum ScriptCategory { diff --git a/pkmn_lib_interface/src/handling/script.rs b/pkmn_lib_interface/src/handling/script.rs index a4702db..379024a 100755 --- a/pkmn_lib_interface/src/handling/script.rs +++ b/pkmn_lib_interface/src/handling/script.rs @@ -410,6 +410,7 @@ impl ScriptOwner { Some(ScriptOwner::Battle(Rc::new(r.unwrap()))) } } + 3 => None, _ => panic!("Unknown script owner kind: {}", kind), } }