use bevy::{ecs::component::Mutable, prelude::*};
use super::prelude::*;
pub trait StatsAppExtension {
fn add_stat_component<T: StatDerived + Component<Mutability = Mutable>>(&mut self) -> &mut Self;
fn add_writeback_component<T: WriteBack + Component>(&mut self) -> &mut Self;
fn add_complex_component<T: StatDerived + WriteBack + Component<Mutability = Mutable>>(&mut self) -> &mut Self;
}
impl StatsAppExtension for App {
fn add_stat_component<T: StatDerived + Component<Mutability = Mutable>>(&mut self) -> &mut Self {
self.add_systems(StatsMutation, update_stat_component_system::<T>
.before(update_stats_proxy_system)
);
self
}
fn add_writeback_component<T: WriteBack + Component>(&mut self) -> &mut Self {
self.add_systems(UpdateWriteBack, update_writeback_value_system::<T>);
self
}
fn add_complex_component<T: StatDerived + WriteBack + Component<Mutability = Mutable>>(&mut self) -> &mut Self {
self.add_stat_component::<T>();
self.add_writeback_component::<T>();
self
}
}
use bevy::{app::MainScheduleOrder, ecs::schedule::ScheduleLabel};
pub fn plugin(app: &mut App) {
app.init_schedule(StatsMutation)
.world_mut()
.resource_mut::<MainScheduleOrder>()
.insert_after(First, StatsMutation);
app.init_schedule(UpdateStatDerived)
.world_mut()
.resource_mut::<MainScheduleOrder>()
.insert_after(StatsMutation, UpdateStatDerived);
app.init_schedule(UpdateWriteBack)
.world_mut()
.resource_mut::<MainScheduleOrder>()
.insert_after(UpdateStatDerived, UpdateWriteBack);
}
#[derive(ScheduleLabel, Debug, Clone, PartialEq, Eq, Hash)]
pub struct StatsMutation;
#[derive(ScheduleLabel, Debug, Clone, PartialEq, Eq, Hash)]
pub struct UpdateStatDerived;
#[derive(ScheduleLabel, Debug, Clone, PartialEq, Eq, Hash)]
pub struct UpdateWriteBack;