mod monster;
mod party;
pub use monster::{LevelUp, MonsterInstance, MonsterStatus, MoveSlot};
pub use party::{BoxStore, Party, PartyFull, StorageBox};
use core::fmt::Debug;
pub trait MonsterProvider {
type SpeciesId: Copy + Eq + Debug;
type MoveId: Copy + Eq + Debug;
type Genetics: Clone + Debug + Default + PartialEq + Eq;
type Training: Clone + Debug + Default + PartialEq + Eq;
type Stat: Copy + Eq + Debug;
fn base_stat(&self, species: Self::SpeciesId, stat: Self::Stat) -> u16;
fn calc_stat(
&self,
species: Self::SpeciesId,
stat: Self::Stat,
level: u8,
genetics: &Self::Genetics,
training: &Self::Training,
) -> u16;
fn stats(&self) -> &[Self::Stat];
fn hp_stat(&self) -> Self::Stat;
fn max_moves(&self) -> usize;
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StatSet<P: MonsterProvider> {
values: Vec<(P::Stat, u16)>,
}
impl<P: MonsterProvider> StatSet<P> {
pub fn zeroed(provider: &P) -> Self {
Self {
values: provider.stats().iter().map(|&s| (s, 0)).collect(),
}
}
pub fn get(&self, stat: P::Stat) -> u16 {
self.values
.iter()
.find(|(s, _)| *s == stat)
.map(|(_, v)| *v)
.unwrap_or(0)
}
pub fn set(&mut self, stat: P::Stat, value: u16) {
if let Some(entry) = self.values.iter_mut().find(|(s, _)| *s == stat) {
entry.1 = value;
} else {
self.values.push((stat, value));
}
}
pub fn iter(&self) -> impl Iterator<Item = (P::Stat, u16)> + '_ {
self.values.iter().map(|(s, v)| (*s, *v))
}
}
pub trait ExpProvider: MonsterProvider {
fn exp_for_level(&self, species: Self::SpeciesId, level: u8) -> u32;
fn max_level(&self) -> u8;
fn levelup_current_hp(&self, old_max_hp: u16, new_max_hp: u16, current_hp: u16) -> u16 {
let _ = old_max_hp;
current_hp.min(new_max_hp)
}
fn learn_moves_on_levelup(
&self,
species: Self::SpeciesId,
level: u8,
moves: &mut Vec<MoveSlot<Self>>,
) -> Vec<Self::MoveId>
where
Self: Sized,
{
let _ = (species, level, moves);
Vec::new()
}
}
pub trait EvolutionProvider: MonsterProvider {
type EvoItem: Copy + Eq + Debug;
fn evolution_target(
&self,
inst: &MonsterInstance<Self>,
trigger: EvolutionTrigger<Self::EvoItem>,
) -> Option<Self::SpeciesId>
where
Self: Sized;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum EvolutionTrigger<Item> {
LevelUp,
Item(Item),
Trade,
}
#[cfg(test)]
mod tests;