Loads more work on battling, initial stretch to run a turn done.
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2022-06-16 17:59:33 +02:00
parent a33369afcc
commit ff541b0696
50 changed files with 105871 additions and 497 deletions

View File

@@ -23,6 +23,52 @@ macro_rules! script_hook {
};
}
#[macro_export]
macro_rules! script_hook_on_lock {
($hook_name: ident, $source: ident, $($parameters: expr),*) => {
let mut aggregator = $source.read().get_script_iterator();
while let Some(script) = aggregator.get_next() {
let lock = &mut script.get();
let script = lock.as_mut().unwrap();
if script.is_suppressed() {
continue;
}
script.$hook_name($($parameters),*);
}
};
}
#[macro_export]
macro_rules! run_scripts {
($hook_name: ident, $source: ident, $($parameters: expr),*) => {
for script in $source {
match script {
ScriptWrapper::Script(s) => {
if let Some(s) = s.upgrade() {
if let Some(s) = s.write().deref_mut() {
if !s.is_suppressed() {
s.$hook_name($($parameters),*);
}
}
}
}
ScriptWrapper::Set(s) => {
if let Some(s) = s.upgrade() {
for s in s.read().get_underlying() {
let mut s = s.1.get();
if let Some(s) = s.deref_mut() {
if !s.is_suppressed() {
s.$hook_name($($parameters),*);
}
}
}
}
}
}
}
};
}
#[derive(Default, Debug)]
pub struct ScriptSourceData {
is_initialized: bool,
@@ -310,25 +356,11 @@ mod tests {
let scripts = vec![ScriptWrapper::from(&set)];
let mut aggregator = ScriptAggregator::new(&scripts as *const Vec<ScriptWrapper>);
assert_eq!(
aggregator
.get_next()
.unwrap()
.get()
.as_mut()
.unwrap()
.name()
.str(),
aggregator.get_next().unwrap().get().as_mut().unwrap().name().str(),
"test_a"
);
assert_eq!(
aggregator
.get_next()
.unwrap()
.get()
.as_mut()
.unwrap()
.name()
.str(),
aggregator.get_next().unwrap().get().as_mut().unwrap().name().str(),
"test_b"
);
@@ -352,14 +384,7 @@ mod tests {
let scripts = vec![ScriptWrapper::from(&set)];
let mut aggregator = ScriptAggregator::new(&scripts as *const Vec<ScriptWrapper>);
assert_eq!(
aggregator
.get_next()
.unwrap()
.get()
.as_mut()
.unwrap()
.name()
.str(),
aggregator.get_next().unwrap().get().as_mut().unwrap().name().str(),
"test_a"
);
@@ -368,14 +393,7 @@ mod tests {
drop(mut_set);
assert_eq!(
aggregator
.get_next()
.unwrap()
.get()
.as_mut()
.unwrap()
.name()
.str(),
aggregator.get_next().unwrap().get().as_mut().unwrap().name().str(),
"test_c"
);
assert!(aggregator.get_next().is_none());

View File

@@ -1,4 +1,4 @@
use crate::dynamic_data::choices::TurnChoice;
use crate::dynamic_data::choices::{MoveChoice, TurnChoice};
use crate::dynamic_data::models::battle::Battle;
use crate::dynamic_data::models::damage_source::DamageSource;
use crate::dynamic_data::models::executing_move::ExecutingMove;
@@ -27,26 +27,27 @@ pub trait Script {
fn on_before_turn(&mut self, _choice: &TurnChoice) {}
fn change_speed(&mut self, _choice: &TurnChoice, _speed: &mut u32) {}
fn change_priority(&mut self, _choice: &TurnChoice, _priority: &mut i8) {}
fn change_move(&mut self, _choice: &TurnChoice, _move_name: &mut StringKey) {}
fn change_number_of_hits(&mut self, _choice: &TurnChoice, _number_of_hits: &mut u8) {}
fn change_move(&mut self, _choice: &MoveChoice, _move_name: &mut StringKey) {}
fn change_number_of_hits(&mut self, _choice: &MoveChoice, _number_of_hits: &mut u8) {}
fn prevent_move(&mut self, _move: &ExecutingMove, _prevent: &mut bool) {}
fn fail_move(&mut self, _move: &ExecutingMove, _fail: &mut bool) {}
fn stop_before_move(&mut self, _move: &ExecutingMove, _stop: &mut bool) {}
fn on_before_move(&mut self, _move: &ExecutingMove) {}
fn fail_incoming_move(&mut self, _move: &ExecutingMove, _target: &Pokemon, _fail: &mut bool) {}
fn is_invulnerable(
fn fail_incoming_move(&mut self, _move: &ExecutingMove, _target: &Arc<RwLock<Pokemon>>, _fail: &mut bool) {}
fn is_invulnerable(&mut self, _move: &ExecutingMove, _target: &Arc<RwLock<Pokemon>>, _invulnerable: &mut bool) {}
fn on_move_miss(&mut self, _move: &ExecutingMove, _target: &Arc<RwLock<Pokemon>>) {}
fn change_move_type(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_invulnerable: &mut bool,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_move_type: &mut u8,
) {
}
fn on_move_miss(&mut self, _move: &ExecutingMove, _target: &Pokemon) {}
fn change_move_type(&mut self, _move: &ExecutingMove, _target: &Pokemon, _move_type: &mut u8) {}
fn change_effectiveness(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_effectiveness: &mut f32,
) {
@@ -54,7 +55,7 @@ pub trait Script {
fn block_critical(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_block_critical: &mut bool,
) {
@@ -62,7 +63,7 @@ pub trait Script {
fn block_incoming_critical(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_block_critical: &mut bool,
) {
@@ -70,7 +71,7 @@ pub trait Script {
fn change_critical_stage(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_stage: &mut u8,
) {
@@ -78,7 +79,7 @@ pub trait Script {
fn change_critical_modifier(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_modifier: &mut f32,
) {
@@ -86,7 +87,7 @@ pub trait Script {
fn change_stab_modifier(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_modifier: &mut f32,
) {
@@ -95,7 +96,7 @@ pub trait Script {
fn change_base_power(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_base_power: &mut u8,
) {
@@ -103,48 +104,48 @@ pub trait Script {
fn change_damage_stats_user(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_stats_user: &mut Pokemon,
_stats_user: &mut Arc<RwLock<Pokemon>>,
) {
}
fn bypass_defensive_stat(
fn bypass_defensive_stat_boost(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_bypass: &mut bool,
) {
}
fn bypass_offensive_stat(
fn bypass_offensive_stat_boost(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_bypass: &mut bool,
) {
}
fn change_offensive_stat(
fn change_offensive_stat_value(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_amount: &mut f32,
_amount: &mut u32,
) {
}
fn change_defensive_stat(
fn change_defensive_stat_value(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_amount: &mut f32,
_amount: &mut u32,
) {
}
fn change_stat_modifier(
fn change_damage_stat_modifier(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_modifier: &mut f32,
) {
@@ -152,29 +153,22 @@ pub trait Script {
fn change_damage_modifier(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_modifier: &mut f32,
) {
}
fn change_damage(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_hit: u8,
_damage: &mut u32,
) {
}
fn change_damage(&mut self, _move: &ExecutingMove, _target: &Arc<RwLock<Pokemon>>, _hit: u8, _damage: &mut u32) {}
fn change_incoming_damage(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_damage: &mut u32,
) {
}
fn on_incoming_hit(&mut self, _move: &ExecutingMove, _target: &Pokemon, _hit: u8) {}
fn on_opponent_faints(&mut self, _move: &ExecutingMove, _target: &Pokemon, _hit: u8) {}
fn on_incoming_hit(&mut self, _move: &ExecutingMove, _target: &Arc<RwLock<Pokemon>>, _hit: u8) {}
fn on_opponent_faints(&mut self, _move: &ExecutingMove, _target: &Arc<RwLock<Pokemon>>, _hit: u8) {}
fn prevent_stat_boost_change(
&mut self,
_target: &Pokemon,
@@ -195,7 +189,7 @@ pub trait Script {
fn prevent_secondary_effect(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_prevent: &mut bool,
) {
@@ -203,21 +197,21 @@ pub trait Script {
fn change_effect_chance(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_chance: &mut f32,
) {
}
fn change_incoming_effect_change(
fn change_incoming_effect_chance(
&mut self,
_move: &ExecutingMove,
_target: &Pokemon,
_target: &Arc<RwLock<Pokemon>>,
_hit: u8,
_chance: &mut f32,
) {
}
fn on_secondary_effect(&mut self, _move: &ExecutingMove, _target: &Pokemon, _hit: u8) {}
fn on_after_hits(&mut self, _move: &ExecutingMove, _target: &Pokemon) {}
fn on_secondary_effect(&mut self, _move: &ExecutingMove, _target: &Arc<RwLock<Pokemon>>, _hit: u8) {}
fn on_after_hits(&mut self, _move: &ExecutingMove, _target: &Arc<RwLock<Pokemon>>) {}
fn prevent_self_switch(&mut self, _choice: &TurnChoice, _prevent: &mut bool) {}
fn prevent_opponent_switch(&mut self, _choice: &TurnChoice, _prevent: &mut bool) {}
fn on_fail(&mut self, _target: &Pokemon) {}
@@ -225,39 +219,14 @@ pub trait Script {
fn prevent_self_run_away(&mut self, _choice: &TurnChoice, _prevent: &mut bool) {}
fn prevent_opponent_run_away(&mut self, _choice: &TurnChoice, _prevent: &mut bool) {}
fn on_end_turn(&mut self) {}
fn on_damage(
&mut self,
_pokemon: &Pokemon,
_source: DamageSource,
_old_health: u32,
_new_health: u32,
) {
}
fn on_damage(&mut self, _pokemon: &Pokemon, _source: DamageSource, _old_health: u32, _new_health: u32) {}
fn on_faint(&mut self, _pokemon: &Pokemon, _source: DamageSource) {}
fn on_switch_in(&mut self, _pokemon: &Pokemon) {}
fn on_after_held_item_consume(&mut self, _pokemon: &Pokemon, _item: &Item) {}
fn change_experience_gained(
&mut self,
_fainted_mon: &Pokemon,
_winning_mon: &Pokemon,
_amount: &mut u32,
) {
}
fn share_experience(
&mut self,
_fainted_mon: &Pokemon,
_winning_mon: &Pokemon,
_shares: &mut bool,
) {
}
fn change_experience_gained(&mut self, _fainted_mon: &Pokemon, _winning_mon: &Pokemon, _amount: &mut u32) {}
fn share_experience(&mut self, _fainted_mon: &Pokemon, _winning_mon: &Pokemon, _shares: &mut bool) {}
fn block_weather(&mut self, _battle: &Battle, _blocked: &mut bool) {}
fn change_capture_rate_bonus(
&mut self,
_target: &Pokemon,
_pokeball: &Item,
_modifier: &mut u8,
) {
}
fn change_capture_rate_bonus(&mut self, _target: &Pokemon, _pokeball: &Item, _modifier: &mut u8) {}
fn as_any(&self) -> &dyn Any;
}

View File

@@ -16,16 +16,11 @@ impl ScriptSet {
return lock.clone();
}
}
self.scripts
.insert(script.name().clone(), ScriptContainer::new(script));
self.scripts.insert(script.name().clone(), ScriptContainer::new(script));
self.scripts.last().unwrap().1.clone()
}
pub fn stack_or_add<'b, F>(
&mut self,
key: &StringKey,
instantiation: &'b F,
) -> PkmnResult<Option<ScriptContainer>>
pub fn stack_or_add<'b, F>(&mut self, key: &StringKey, instantiation: &'b F) -> PkmnResult<Option<ScriptContainer>>
where
F: Fn() -> PkmnResult<Option<Box<dyn Script>>>,
{
@@ -76,4 +71,8 @@ impl ScriptSet {
pub fn count(&self) -> usize {
self.scripts.len()
}
pub(crate) fn get_underlying(&self) -> &IndexMap<StringKey, ScriptContainer> {
&self.scripts
}
}