use crate::dynamic_data::event_hooks::event_hook::EventHook; use crate::dynamic_data::flow::choice_queue::ChoiceQueue; use crate::dynamic_data::history::history_holder::HistoryHolder; use crate::dynamic_data::libraries::dynamic_library::DynamicLibrary; use crate::dynamic_data::models::battle_party::BattleParty; use crate::dynamic_data::models::battle_random::BattleRandom; use crate::dynamic_data::models::battle_result::BattleResult; use crate::dynamic_data::models::battle_side::BattleSide; use crate::dynamic_data::script_handling::script_set::ScriptSet; use derive_getters::Getters; use std::sync::{Arc, RwLock}; #[derive(Getters, Debug)] pub struct Battle<'a> { #[getter(skip)] library: &'a DynamicLibrary<'a>, parties: Vec>, can_flee: bool, number_of_sides: u8, pokemon_per_side: u8, sides: Vec>, #[getter(skip)] random: BattleRandom, choice_queue: ChoiceQueue, has_ended: bool, result: BattleResult, event_hook: EventHook, history_holder: Box, current_turn: u32, volatile: ScriptSet, last_turn_time: i64, } impl<'a> Battle<'a> { pub fn new( library: &'a DynamicLibrary<'a>, parties: Vec>, can_flee: bool, number_of_sides: u8, pokemon_per_side: u8, random_seed: Option, ) -> Arc> { let random = if let Some(seed) = random_seed { BattleRandom::new_with_seed(seed) } else { BattleRandom::default() }; let sides = Vec::with_capacity(number_of_sides as usize); let battle = Arc::new(RwLock::new(Self { library, parties, can_flee, number_of_sides, pokemon_per_side, sides, random, choice_queue: ChoiceQueue {}, has_ended: false, result: BattleResult::Inconclusive, event_hook: Default::default(), history_holder: Box::new(HistoryHolder {}), current_turn: 0, volatile: ScriptSet::default(), last_turn_time: 0, })); for i in 0..number_of_sides { battle.write().unwrap().sides[i as usize] = BattleSide::new(i, Arc::downgrade(&battle), pokemon_per_side); } battle } pub fn random(&self) -> &BattleRandom { &self.random } pub fn can_slot_be_filled(&self) -> bool { todo!() } pub fn library(&self) -> &'a DynamicLibrary<'a> { self.library } }