Add more difficulty
This commit is contained in:
@@ -4,10 +4,11 @@ use rltk::{Point, Rltk, VirtualKeyCode};
|
||||
use specs::prelude::*;
|
||||
|
||||
use crate::gamelog::GameLog;
|
||||
use crate::spawner::player;
|
||||
use crate::{
|
||||
components::{CombatStats, Player, Position, Viewshed, WantsToMelee},
|
||||
map::Map,
|
||||
Item, RunState, State, WantsToPickupItem,
|
||||
Item, Monster, RunState, State, TileType, WantsToPickupItem,
|
||||
};
|
||||
|
||||
pub fn try_move_player(delta_x: i32, delta_y: i32, ecs: &mut World) {
|
||||
@@ -99,6 +100,7 @@ pub fn player_input(gs: &mut State, ctx: &mut Rltk) -> RunState {
|
||||
VirtualKeyCode::Right | VirtualKeyCode::L => try_move_player(1, 0, &mut gs.ecs),
|
||||
VirtualKeyCode::Up | VirtualKeyCode::K => try_move_player(0, -1, &mut gs.ecs),
|
||||
VirtualKeyCode::Down | VirtualKeyCode::J => try_move_player(0, 1, &mut gs.ecs),
|
||||
VirtualKeyCode::Space => return skip_turn(&mut gs.ecs),
|
||||
VirtualKeyCode::Y => try_move_player(1, -1, &mut gs.ecs),
|
||||
VirtualKeyCode::U => try_move_player(-1, -1, &mut gs.ecs),
|
||||
VirtualKeyCode::N => try_move_player(1, 1, &mut gs.ecs),
|
||||
@@ -107,9 +109,56 @@ pub fn player_input(gs: &mut State, ctx: &mut Rltk) -> RunState {
|
||||
VirtualKeyCode::I => return RunState::ShowInventory,
|
||||
VirtualKeyCode::D => return RunState::ShowDropItem,
|
||||
VirtualKeyCode::Escape => return RunState::SaveGame,
|
||||
VirtualKeyCode::Period => {
|
||||
if try_next_level(&mut gs.ecs) {
|
||||
return RunState::NextLevel;
|
||||
}
|
||||
}
|
||||
_ => return RunState::AwaitingInput,
|
||||
},
|
||||
}
|
||||
|
||||
RunState::PlayerTurn
|
||||
}
|
||||
|
||||
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() {
|
||||
if let Some(mob) = monsters.get(*entity_id) {
|
||||
can_heal = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if can_heal {
|
||||
let mut health_component = ecs.write_storage::<CombatStats>();
|
||||
let player_hp = health_component.get_mut(*player_entity).unwrap();
|
||||
player_hp.hp = i32::min(player_hp.hp + 1, player_hp.max_hp);
|
||||
}
|
||||
|
||||
RunState::PlayerTurn
|
||||
}
|
||||
|
||||
fn try_next_level(ecs: &mut World) -> bool {
|
||||
let player_pos = ecs.fetch::<Point>();
|
||||
let map = ecs.fetch::<Map>();
|
||||
let player_idx = map.xy_idx(player_pos.x, player_pos.y);
|
||||
|
||||
if map.tiles[player_idx] == TileType::DownStairs {
|
||||
true
|
||||
} else {
|
||||
let mut gamelog = ecs.fetch_mut::<GameLog>();
|
||||
gamelog
|
||||
.entries
|
||||
.push("There is no way down from here".to_string());
|
||||
false
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user