|
@@ -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) {
|