Browse Source

Move movement system to its own module

Getty Ritter 4 years ago
parent
commit
05ce97aae5

+ 2 - 1
chapter-07-damage/src/main.rs

@@ -21,6 +21,7 @@ mod map_indexing_system;
 use map_indexing_system::MapIndexingSystem;
 mod melee_combat_system;
 use melee_combat_system::MeleeCombatSystem;
+mod movement_system;
 mod damage_system;
 use damage_system::DamageSystem;
 
@@ -72,7 +73,7 @@ impl GameState for State {
             }
         }
         player::HandleInputEvent.run_now(&self.ecs);
-        player::HandleMoveEvent.run_now(&self.ecs);
+        movement_system::HandleMoveEvent.run_now(&self.ecs);
         *self.ecs.write_resource() = newrunstate;
         damage_system::CleanupDead.run_now(&self.ecs);
 

+ 41 - 0
chapter-07-damage/src/movement_system.rs

@@ -0,0 +1,41 @@
+use crate::components::{MoveEvent, Position, Viewshed};
+use crate::map::Map;
+
+use rltk::Point;
+use specs::prelude::*;
+
+fn clamp<T: PartialOrd>(low: T, high: T, val: T) -> T {
+    if val < low {
+        low
+    } else if val > high {
+        high
+    } else {
+        val
+    }
+}
+
+pub struct HandleMoveEvent;
+
+impl<'a> System<'a> for HandleMoveEvent {
+    type SystemData = (
+        WriteStorage<'a, MoveEvent>,
+        WriteStorage<'a, Position>,
+        WriteStorage<'a, Viewshed>,
+        WriteExpect<'a, Point>,
+        ReadExpect<'a, Map>,
+    );
+
+    fn run(&mut self, (mut move_events, mut pos, mut viewshed, mut point, map): Self::SystemData) {
+        for (&event, pos, viewshed) in (&move_events, &mut pos, &mut viewshed).join() {
+            let MoveEvent { destination, tgt_x, tgt_y } = event;
+            if !map.blocked[destination] {
+                viewshed.dirty = true;
+                pos.x = tgt_x;
+                pos.y = tgt_y;
+                point.x = clamp(0, 79, tgt_x);
+                point.y = clamp(0, 49, tgt_y);
+            }
+        }
+        move_events.clear();
+    }
+}

+ 8 - 39
chapter-07-damage/src/player.rs

@@ -1,47 +1,15 @@
 extern crate rltk;
-use rltk::{Point, Rltk, VirtualKeyCode};
+use rltk::{Rltk, VirtualKeyCode};
 extern crate specs;
-use super::{CombatStats, Map, Position, MoveEvent, RunState, State, Viewshed, WantsToMelee, InputEvent};
+use super::{CombatStats, Map, Position, MoveEvent, RunState, State, WantsToMelee, InputEvent};
 use specs::prelude::*;
 
 
-fn clamp<T: PartialOrd>(low: T, high: T, val: T) -> T {
-    if val < low {
-        low
-    } else if val > high {
-        high
-    } else {
-        val
-    }
-}
-
-pub struct HandleMoveEvent;
-
-impl<'a> System<'a> for HandleMoveEvent {
-    type SystemData = (
-        WriteStorage<'a, MoveEvent>,
-        WriteStorage<'a, Position>,
-        WriteStorage<'a, Viewshed>,
-        WriteExpect<'a, Point>,
-        ReadExpect<'a, Map>,
-    );
-
-    fn run(&mut self, (mut move_events, mut pos, mut viewshed, mut point, map): Self::SystemData) {
-        for (&event, pos, viewshed) in (&move_events, &mut pos, &mut viewshed).join() {
-            let MoveEvent { destination, tgt_x, tgt_y } = event;
-            if !map.blocked[destination] {
-                viewshed.dirty = true;
-                pos.x = tgt_x;
-                pos.y = tgt_y;
-                point.x = clamp(0, 79, tgt_x);
-                point.y = clamp(0, 49, tgt_y);
-            }
-        }
-        move_events.clear();
-    }
-}
-
-
+/// Handles converting low-level `InputEvent` components (which may
+/// represent one of several actions, or even a completely invalid
+/// action such as walking into a wall) and dispatches them to the
+/// relevant high-level intention (e.g. moving in a direction or
+/// attacking a target)
 pub struct HandleInputEvent;
 
 impl<'a> System<'a> for HandleInputEvent {
@@ -78,6 +46,7 @@ impl<'a> System<'a> for HandleInputEvent {
     }
 }
 
+/// Translates keyboard input into the appropriate `InputEvent` value
 pub fn player_input(gs: &mut State, ctx: &mut Rltk) -> RunState {
     let player = *gs.ecs.fetch::<Entity>();
     let mut input = gs.ecs.write_storage::<InputEvent>();