| 
					
				 | 
			
			
				@@ -3,7 +3,7 @@ use rltk::{VirtualKeyCode, Rltk, Point}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 extern crate specs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use specs::prelude::*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use super::{Position, Player, Viewshed, State, Map, RunState, CombatStats, WantsToMelee, Item, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    gamelog::GameLog, WantsToPickupItem, TileType}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    gamelog::GameLog, WantsToPickupItem, TileType, Monster}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let mut positions = ecs.write_storage::<Position>(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -79,6 +79,35 @@ fn get_item(ecs: &mut World) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+fn skip_turn(ecs: &mut World) -> RunState { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let player_entity = ecs.fetch::<Entity>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let viewshed_components = ecs.read_storage::<Viewshed>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let monsters = ecs.read_storage::<Monster>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let worldmap_resource = ecs.fetch::<Map>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let mut can_heal = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let viewshed = viewshed_components.get(*player_entity).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for tile in viewshed.visible_tiles.iter() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let idx = worldmap_resource.xy_idx(tile.x, tile.y); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for entity_id in worldmap_resource.tile_content[idx].iter() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let mob = monsters.get(*entity_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            match mob { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                None => {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Some(_) => { can_heal = false; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if can_heal { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut health_components = ecs.write_storage::<CombatStats>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let player_hp = health_components.get_mut(*player_entity).unwrap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        player_hp.hp = i32::min(player_hp.hp + 1, player_hp.max_hp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RunState::PlayerTurn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 pub fn player_input(gs: &mut State, ctx: &mut Rltk) -> RunState { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Player movement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     match ctx.key { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -113,6 +142,10 @@ pub fn player_input(gs: &mut State, ctx: &mut Rltk) -> RunState { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             VirtualKeyCode::Numpad1 => try_move_player(-1, 1, &mut gs.ecs), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             VirtualKeyCode::B => try_move_player(-1, 1, &mut gs.ecs), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Skip Turn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            VirtualKeyCode::Numpad5 => return skip_turn(&mut gs.ecs), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            VirtualKeyCode::Space => return skip_turn(&mut gs.ecs), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // Level changes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             VirtualKeyCode::Period => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if try_next_level(&mut gs.ecs) { 
			 |