PkmnLib_rs/src/dynamic_data/models/battle.rs

86 lines
2.5 KiB
Rust
Raw Normal View History

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;
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>,
) -> 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 {
BattleRandom::default()
2022-06-03 14:35:18 +00:00
};
let sides = Vec::with_capacity(number_of_sides as usize);
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 {
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
}
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
}