2022-06-03 14:35:18 +00:00
|
|
|
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;
|
2022-06-04 10:40:32 +00:00
|
|
|
use std::sync::{Arc, RwLock};
|
2022-06-03 14:35:18 +00:00
|
|
|
|
|
|
|
#[derive(Getters, Debug)]
|
|
|
|
pub struct Battle<'a> {
|
2022-06-06 11:54:59 +00:00
|
|
|
#[getter(skip)]
|
2022-06-03 14:35:18 +00:00
|
|
|
library: &'a DynamicLibrary<'a>,
|
2022-06-06 11:54:59 +00:00
|
|
|
parties: Vec<BattleParty<'a>>,
|
2022-06-03 14:35:18 +00:00
|
|
|
can_flee: bool,
|
|
|
|
number_of_sides: u8,
|
|
|
|
pokemon_per_side: u8,
|
|
|
|
sides: Vec<BattleSide<'a>>,
|
|
|
|
#[getter(skip)]
|
|
|
|
random: BattleRandom,
|
|
|
|
choice_queue: ChoiceQueue,
|
|
|
|
has_ended: bool,
|
|
|
|
result: BattleResult,
|
|
|
|
event_hook: EventHook,
|
|
|
|
history_holder: Box<HistoryHolder>,
|
|
|
|
current_turn: u32,
|
|
|
|
volatile: ScriptSet,
|
|
|
|
last_turn_time: i64,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Battle<'a> {
|
|
|
|
pub fn new(
|
|
|
|
library: &'a DynamicLibrary<'a>,
|
2022-06-06 11:54:59 +00:00
|
|
|
parties: Vec<BattleParty<'a>>,
|
2022-06-03 14:35:18 +00:00
|
|
|
can_flee: bool,
|
|
|
|
number_of_sides: u8,
|
|
|
|
pokemon_per_side: u8,
|
|
|
|
random_seed: Option<u128>,
|
2022-06-04 10:40:32 +00:00
|
|
|
) -> Arc<RwLock<Self>> {
|
2022-06-03 14:35:18 +00:00
|
|
|
let random = if let Some(seed) = random_seed {
|
|
|
|
BattleRandom::new_with_seed(seed)
|
|
|
|
} else {
|
2022-06-04 10:40:32 +00:00
|
|
|
BattleRandom::default()
|
2022-06-03 14:35:18 +00:00
|
|
|
};
|
|
|
|
let sides = Vec::with_capacity(number_of_sides as usize);
|
2022-06-04 10:40:32 +00:00
|
|
|
let battle = Arc::new(RwLock::new(Self {
|
2022-06-03 14:35:18 +00:00
|
|
|
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,
|
2022-06-06 11:54:59 +00:00
|
|
|
volatile: ScriptSet::default(),
|
2022-06-03 14:35:18 +00:00
|
|
|
last_turn_time: 0,
|
|
|
|
}));
|
|
|
|
|
|
|
|
for i in 0..number_of_sides {
|
2022-06-04 10:40:32 +00:00
|
|
|
battle.write().unwrap().sides[i as usize] =
|
2022-06-03 14:35:18 +00:00
|
|
|
BattleSide::new(i, Arc::downgrade(&battle), pokemon_per_side);
|
|
|
|
}
|
|
|
|
battle
|
|
|
|
}
|
|
|
|
|
2022-06-04 10:40:32 +00:00
|
|
|
pub fn random(&self) -> &BattleRandom {
|
|
|
|
&self.random
|
2022-06-03 14:35:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn can_slot_be_filled(&self) -> bool {
|
|
|
|
todo!()
|
|
|
|
}
|
2022-06-06 11:54:59 +00:00
|
|
|
|
|
|
|
pub fn library(&self) -> &'a DynamicLibrary<'a> {
|
|
|
|
self.library
|
|
|
|
}
|
2022-06-03 14:35:18 +00:00
|
|
|
}
|