use weasel::rules::{statistic::SimpleStatistic, status::SimpleStatus};
use weasel::status::{Application, AppliedStatus, Potency, Status, StatusDuration, StatusId};
use weasel::{
battle_rules, rules::empty::*, AlterStatistics, BattleRules, BattleState, Character,
CharacterRules, Entropy, EventQueue, EventTrigger, FightRules, Id, LinkedQueue, Transmutation,
WriteMetrics,
};
pub(crate) const HEALTH: u8 = 0;
pub(crate) const VIGOR: u8 = 0;
pub(crate) const DOT: u8 = 1;
battle_rules! {
EmptyTeamRules,
CustomCharacterRules,
EmptyActorRules,
CustomFightRules,
EmptyUserRules,
EmptySpaceRules,
EmptyRoundsRules,
EmptyEntropyRules
}
#[derive(Default)]
pub struct CustomCharacterRules {}
impl CharacterRules<CustomRules> for CustomCharacterRules {
type CreatureId = u8;
type ObjectId = u8;
type Statistic = SimpleStatistic<u8, i8>;
type StatisticsSeed = i8;
type StatisticsAlteration = i8;
type Status = SimpleStatus<u8, i8>;
type StatusesAlteration = ();
fn generate_statistics(
&self,
seed: &Option<Self::StatisticsSeed>,
_entropy: &mut Entropy<CustomRules>,
_metrics: &mut WriteMetrics<CustomRules>,
) -> Box<dyn Iterator<Item = Self::Statistic>> {
let min = 0;
let max = 100;
let value = seed.unwrap();
let v = vec![SimpleStatistic::with_value(HEALTH, min, max, value)];
Box::new(v.into_iter())
}
fn alter_statistics(
&self,
character: &mut dyn Character<CustomRules>,
alteration: &Self::StatisticsAlteration,
_entropy: &mut Entropy<CustomRules>,
_metrics: &mut WriteMetrics<CustomRules>,
) -> Option<Transmutation> {
let current = character.statistic(&HEALTH).unwrap().value();
character
.statistic_mut(&HEALTH)
.unwrap()
.set_value(current + alteration);
None
}
fn generate_status(
&self,
_character: &dyn Character<CustomRules>,
status_id: &StatusId<CustomRules>,
potency: &Option<Potency<CustomRules>>,
_entropy: &mut Entropy<CustomRules>,
_metrics: &mut WriteMetrics<CustomRules>,
) -> Option<Status<CustomRules>> {
let potency = potency.unwrap();
let effect = potency.0;
let duration = potency.1;
Some(SimpleStatus::new(*status_id, effect, duration))
}
}
#[derive(Default)]
pub struct CustomFightRules {}
impl FightRules<CustomRules> for CustomFightRules {
type Impact = ();
type Potency = (i8, Option<StatusDuration>);
fn apply_status(
&self,
_state: &BattleState<CustomRules>,
character: &dyn Character<CustomRules>,
application: Application<CustomRules>,
event_queue: &mut Option<EventQueue<CustomRules>>,
_entropy: &mut Entropy<CustomRules>,
_metrics: &mut WriteMetrics<CustomRules>,
) {
let status = match application {
Application::New(new) => new,
Application::Replacement(_, new) => new,
};
if *status.id() == VIGOR {
AlterStatistics::trigger(event_queue, *character.entity_id(), status.effect()).fire();
}
}
fn update_status(
&self,
_state: &BattleState<CustomRules>,
character: &dyn Character<CustomRules>,
status: &AppliedStatus<CustomRules>,
linked_queue: &mut Option<LinkedQueue<CustomRules>>,
_entropy: &mut Entropy<CustomRules>,
_metrics: &mut WriteMetrics<CustomRules>,
) -> bool {
if *status.id() == DOT {
AlterStatistics::trigger(linked_queue, *character.entity_id(), -status.effect()).fire();
}
if let Some(max_duration) = status.max_duration() {
status.duration() == max_duration
} else {
false
}
}
fn delete_status(
&self,
_state: &BattleState<CustomRules>,
character: &dyn Character<CustomRules>,
status: &AppliedStatus<CustomRules>,
event_queue: &mut Option<EventQueue<CustomRules>>,
_entropy: &mut Entropy<CustomRules>,
_metrics: &mut WriteMetrics<CustomRules>,
) {
if *status.id() == VIGOR {
AlterStatistics::trigger(event_queue, *character.entity_id(), -status.effect()).fire();
}
}
}