summaryrefslogtreecommitdiff
path: root/engine-ecs/examples/extension.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine-ecs/examples/extension.rs')
-rw-r--r--engine-ecs/examples/extension.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/engine-ecs/examples/extension.rs b/engine-ecs/examples/extension.rs
new file mode 100644
index 0000000..a96c1a7
--- /dev/null
+++ b/engine-ecs/examples/extension.rs
@@ -0,0 +1,70 @@
+use engine_ecs::actions::Actions;
+use engine_ecs::extension::{Collector as ExtensionCollector, Extension};
+use engine_ecs::phase::UPDATE as UPDATE_PHASE;
+use engine_ecs::{Component, Query, World};
+
+#[derive(Debug, Component)]
+struct Position
+{
+ x: u32,
+ y: u32,
+}
+
+#[derive(Debug, Component)]
+struct EnemySpawnSource;
+
+#[derive(Debug, Component)]
+enum EvilnessLevel
+{
+ Medium,
+}
+
+fn spawn_enemies(
+ spawner_query: Query<(&EnemySpawnSource, &Position)>,
+ enemies_query: Query<(&EvilnessLevel,)>,
+ mut actions: Actions,
+)
+{
+ let Some((_, enemy_spawner_position)) = spawner_query.iter().next() else {
+ return;
+ };
+
+ let enemy_cnt = enemies_query.iter().count();
+
+ if enemy_cnt > 3 {
+ return;
+ }
+
+ actions.spawn((
+ EvilnessLevel::Medium,
+ Position {
+ x: enemy_spawner_position.x * enemy_cnt as u32,
+ y: enemy_spawner_position.y,
+ },
+ ));
+
+ println!("Spawned enemy with medium evilness and 45 strength");
+}
+
+struct EnemySpawningExtension;
+
+impl Extension for EnemySpawningExtension
+{
+ fn collect(self, mut collector: ExtensionCollector<'_>)
+ {
+ collector.add_system(*UPDATE_PHASE, spawn_enemies);
+
+ collector.add_entity((Position { x: 187, y: 30 }, EnemySpawnSource));
+ }
+}
+
+fn main()
+{
+ let mut world = World::new();
+
+ world.add_extension(EnemySpawningExtension);
+
+ for _ in 0..7 {
+ world.step();
+ }
+}