Game stats that reset every frame, inspired by immediate mode GUI.
gamedev bevy stats
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Added bevy plugin.

+76
+73
src/bevy.rs
··· 1 + use crate::StatContainer; 2 + use bevy_app::{App, Plugin, PreUpdate}; 3 + use bevy_ecs::prelude::*; 4 + use bevy_ecs::query::Without; 5 + use bevy_ecs::system::Query; 6 + use std::marker::PhantomData; 7 + 8 + /// [Resets](StatContainer::reset_modifiers) all stat modifiers for component `T` in [`PreUpdate`]. 9 + #[derive(Default)] 10 + pub struct ImmediateStatsPlugin<T: Component + StatContainer> { 11 + phantom_data: PhantomData<T>, 12 + } 13 + 14 + /// Prevents all [`StatContainers`](StatContainer) from resetting. 15 + #[derive(Component, Default)] 16 + #[component(storage = "SparseSet")] 17 + pub struct PauseStatReset; 18 + 19 + impl<T: Component + StatContainer> Plugin for ImmediateStatsPlugin<T> { 20 + fn build(&self, app: &mut App) { 21 + app.add_systems(PreUpdate, reset_modifiers::<T>); 22 + } 23 + } 24 + 25 + fn reset_modifiers<T: Component + StatContainer>( 26 + mut query: Query<&mut T, Without<PauseStatReset>>, 27 + ) { 28 + for mut stat in &mut query { 29 + stat.reset_modifiers(); 30 + } 31 + } 32 + 33 + #[cfg(test)] 34 + mod tests { 35 + use super::*; 36 + use immediate_stats_macros::StatContainer; 37 + 38 + #[derive(Component, StatContainer, PartialEq, Debug)] 39 + struct Damage { 40 + #[base(health)] 41 + damage_base: i32, 42 + #[bonus(health)] 43 + damage_bonus: i32, 44 + #[multiplier(health)] 45 + damage_multiplier: f32, 46 + } 47 + 48 + #[test] 49 + fn plugin() { 50 + let mut world = World::new(); 51 + let system = world.register_system(reset_modifiers::<Damage>); 52 + 53 + let entity = world 54 + .spawn(Damage { 55 + damage_base: 100, 56 + damage_bonus: 50, 57 + damage_multiplier: 2.0, 58 + }) 59 + .id(); 60 + 61 + world.run_system(system).unwrap(); 62 + 63 + assert_eq!( 64 + world.get::<Damage>(entity), 65 + Some(Damage { 66 + damage_base: 100, 67 + damage_bonus: 0, 68 + damage_multiplier: 1.0, 69 + }) 70 + .as_ref() 71 + ); 72 + } 73 + }
+3
src/lib.rs
··· 1 + #[cfg(feature = "bevy")] 2 + pub mod bevy; 3 + 1 4 pub trait StatContainer { 2 5 /// Resets all stat bonuses to zero, and stat multipliers to one. 3 6 fn reset_modifiers(&mut self);