From 156b4e146d5f29ad687262990f822a93a1f7eb3d Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 10 Sep 2022 13:08:44 +0200 Subject: [PATCH] Implements struggle. --- gen_7_scripts/src/moves/mod.rs | 1 + gen_7_scripts/src/moves/struggle.rs | 55 +++++++++++++++++++ gen_7_scripts/src/registered_scripts.rs | 1 + .../src/app_interface/dynamic_data/pokemon.rs | 2 + 4 files changed, 59 insertions(+) create mode 100644 gen_7_scripts/src/moves/struggle.rs diff --git a/gen_7_scripts/src/moves/mod.rs b/gen_7_scripts/src/moves/mod.rs index d2ba007..fc25546 100755 --- a/gen_7_scripts/src/moves/mod.rs +++ b/gen_7_scripts/src/moves/mod.rs @@ -13,3 +13,4 @@ pub mod drain; pub mod light_screen; pub mod multi_hit_move; pub mod reflect; +pub mod struggle; diff --git a/gen_7_scripts/src/moves/struggle.rs b/gen_7_scripts/src/moves/struggle.rs new file mode 100644 index 0000000..7dbcedb --- /dev/null +++ b/gen_7_scripts/src/moves/struggle.rs @@ -0,0 +1,55 @@ +use crate::script; +use core::any::Any; +use pkmn_lib_interface::app_interface::{DamageSource, ExecutingMove, Pokemon, TurnChoice}; +use pkmn_lib_interface::handling::{Script, ScriptCapabilities}; + +script!(Struggle, "struggle"); + +impl Script for Struggle { + fn new() -> Self { + Self {} + } + + fn get_name(&self) -> &'static str { + Self::get_const_name() + } + + fn get_capabilities(&self) -> &[ScriptCapabilities] { + &[ + ScriptCapabilities::ChangeEffectiveness, + ScriptCapabilities::IsInvulnerable, + ScriptCapabilities::ChangeNumberOfHits, + ScriptCapabilities::OnSecondaryEffect, + ] + } + + fn change_effectiveness( + &self, + _move: ExecutingMove, + _target: Pokemon, + _hit: u8, + effectiveness: &mut f32, + ) { + *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 { + damage = 1 + } + mv.user().damage(damage, DamageSource::Struggle); + } + + fn as_any(&self) -> &dyn Any { + self + } +} diff --git a/gen_7_scripts/src/registered_scripts.rs b/gen_7_scripts/src/registered_scripts.rs index 0b41cc6..23209b4 100755 --- a/gen_7_scripts/src/registered_scripts.rs +++ b/gen_7_scripts/src/registered_scripts.rs @@ -44,6 +44,7 @@ pub fn get_script(category: ScriptCategory, name: &StringKey) -> Option {} diff --git a/pkmn_lib_interface/src/app_interface/dynamic_data/pokemon.rs b/pkmn_lib_interface/src/app_interface/dynamic_data/pokemon.rs index 5a6d7aa..2db0948 100755 --- a/pkmn_lib_interface/src/app_interface/dynamic_data/pokemon.rs +++ b/pkmn_lib_interface/src/app_interface/dynamic_data/pokemon.rs @@ -291,6 +291,8 @@ pub enum DamageSource { MoveDamage = 0, /// The damage is done by something else. Misc = 1, + /// The damage is done because of struggling. + Struggle = 2, } crate::handling::cacheable::cacheable!(Pokemon);