use super::{MonsterInstance, MonsterProvider};
#[derive(Debug, PartialEq, Eq)]
pub struct PartyFull<P: MonsterProvider>(pub MonsterInstance<P>);
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Party<P: MonsterProvider> {
members: Vec<MonsterInstance<P>>,
capacity: usize,
}
impl<P: MonsterProvider> Party<P> {
pub fn new(capacity: usize) -> Self {
Self {
members: Vec::new(),
capacity,
}
}
pub fn capacity(&self) -> usize {
self.capacity
}
pub fn len(&self) -> usize {
self.members.len()
}
pub fn is_empty(&self) -> bool {
self.members.is_empty()
}
pub fn is_full(&self) -> bool {
self.members.len() >= self.capacity
}
pub fn add(&mut self, m: MonsterInstance<P>) -> Result<(), PartyFull<P>> {
if self.is_full() {
return Err(PartyFull(m));
}
self.members.push(m);
Ok(())
}
pub fn remove(&mut self, index: usize) -> Option<MonsterInstance<P>> {
if index < self.members.len() {
Some(self.members.remove(index))
} else {
None
}
}
pub fn swap(&mut self, a: usize, b: usize) {
if a < self.members.len() && b < self.members.len() {
self.members.swap(a, b);
}
}
pub fn get(&self, index: usize) -> Option<&MonsterInstance<P>> {
self.members.get(index)
}
pub fn get_mut(&mut self, index: usize) -> Option<&mut MonsterInstance<P>> {
self.members.get_mut(index)
}
pub fn first_able(&self) -> Option<usize> {
self.members.iter().position(|m| !m.is_fainted())
}
pub fn all_fainted(&self) -> bool {
!self.members.is_empty() && self.members.iter().all(|m| m.is_fainted())
}
pub fn iter(&self) -> impl Iterator<Item = &MonsterInstance<P>> {
self.members.iter()
}
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut MonsterInstance<P>> {
self.members.iter_mut()
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StorageBox<P: MonsterProvider> {
members: Vec<MonsterInstance<P>>,
capacity: usize,
}
impl<P: MonsterProvider> StorageBox<P> {
pub fn new(capacity: usize) -> Self {
Self {
members: Vec::new(),
capacity,
}
}
pub fn capacity(&self) -> usize {
self.capacity
}
pub fn len(&self) -> usize {
self.members.len()
}
pub fn is_empty(&self) -> bool {
self.members.is_empty()
}
pub fn is_full(&self) -> bool {
self.members.len() >= self.capacity
}
pub fn add(&mut self, m: MonsterInstance<P>) -> Result<(), PartyFull<P>> {
if self.is_full() {
return Err(PartyFull(m));
}
self.members.push(m);
Ok(())
}
pub fn remove(&mut self, index: usize) -> Option<MonsterInstance<P>> {
if index < self.members.len() {
Some(self.members.remove(index))
} else {
None
}
}
pub fn get(&self, index: usize) -> Option<&MonsterInstance<P>> {
self.members.get(index)
}
pub fn get_mut(&mut self, index: usize) -> Option<&mut MonsterInstance<P>> {
self.members.get_mut(index)
}
pub fn iter(&self) -> impl Iterator<Item = &MonsterInstance<P>> {
self.members.iter()
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BoxStore<P: MonsterProvider> {
boxes: Vec<StorageBox<P>>,
current: usize,
}
impl<P: MonsterProvider> BoxStore<P> {
pub fn new(box_count: usize, box_capacity: usize) -> Self {
Self {
boxes: (0..box_count)
.map(|_| StorageBox::new(box_capacity))
.collect(),
current: 0,
}
}
pub fn box_count(&self) -> usize {
self.boxes.len()
}
pub fn current_index(&self) -> usize {
self.current
}
pub fn current(&self) -> &StorageBox<P> {
&self.boxes[self.current]
}
pub fn current_mut(&mut self) -> &mut StorageBox<P> {
&mut self.boxes[self.current]
}
pub fn get(&self, index: usize) -> Option<&StorageBox<P>> {
self.boxes.get(index)
}
pub fn get_mut(&mut self, index: usize) -> Option<&mut StorageBox<P>> {
self.boxes.get_mut(index)
}
pub fn switch(&mut self, index: usize) {
if index < self.boxes.len() {
self.current = index;
}
}
}