Add item to reveal current map, completes section 3.5
This commit is contained in:
parent
3effbdb586
commit
d0b0a84984
@ -196,6 +196,9 @@ pub struct HungerClock {
|
|||||||
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct ProvidesFood {}
|
pub struct ProvidesFood {}
|
||||||
|
|
||||||
|
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct MagicMapper {}
|
||||||
|
|
||||||
// Serialization helper code. We need to implement ConvertSaveLoad for each type that contains an
|
// Serialization helper code. We need to implement ConvertSaveLoad for each type that contains an
|
||||||
// Entity.
|
// Entity.
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::components::*;
|
use crate::components::*;
|
||||||
use crate::{game_log::GameLog, particle_system::ParticleBuilder, Map};
|
use crate::{game_log::GameLog, particle_system::ParticleBuilder, Map, RunState};
|
||||||
use rltk::RGB;
|
use rltk::RGB;
|
||||||
use specs::prelude::*;
|
use specs::prelude::*;
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ impl<'a> System<'a> for ItemUseSystem {
|
|||||||
type SystemData = (
|
type SystemData = (
|
||||||
ReadExpect<'a, Entity>,
|
ReadExpect<'a, Entity>,
|
||||||
WriteExpect<'a, GameLog>,
|
WriteExpect<'a, GameLog>,
|
||||||
ReadExpect<'a, Map>,
|
WriteExpect<'a, Map>,
|
||||||
Entities<'a>,
|
Entities<'a>,
|
||||||
WriteStorage<'a, WantsToUseItem>,
|
WriteStorage<'a, WantsToUseItem>,
|
||||||
ReadStorage<'a, Name>,
|
ReadStorage<'a, Name>,
|
||||||
@ -68,6 +68,8 @@ impl<'a> System<'a> for ItemUseSystem {
|
|||||||
ReadStorage<'a, Position>,
|
ReadStorage<'a, Position>,
|
||||||
ReadStorage<'a, ProvidesFood>,
|
ReadStorage<'a, ProvidesFood>,
|
||||||
WriteStorage<'a, HungerClock>,
|
WriteStorage<'a, HungerClock>,
|
||||||
|
ReadStorage<'a, MagicMapper>,
|
||||||
|
WriteExpect<'a, RunState>,
|
||||||
);
|
);
|
||||||
|
|
||||||
#[allow(clippy::cognitive_complexity)]
|
#[allow(clippy::cognitive_complexity)]
|
||||||
@ -93,6 +95,8 @@ impl<'a> System<'a> for ItemUseSystem {
|
|||||||
positions,
|
positions,
|
||||||
provides_food,
|
provides_food,
|
||||||
mut hunger_clocks,
|
mut hunger_clocks,
|
||||||
|
magic_mapper,
|
||||||
|
mut runstate,
|
||||||
) = data;
|
) = data;
|
||||||
|
|
||||||
for (entity, useitem) in (&entities, &wants_use).join() {
|
for (entity, useitem) in (&entities, &wants_use).join() {
|
||||||
@ -207,6 +211,17 @@ impl<'a> System<'a> for ItemUseSystem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If its a magic mapper...
|
||||||
|
match magic_mapper.get(useitem.item) {
|
||||||
|
None => {}
|
||||||
|
Some(_) => {
|
||||||
|
used_item = true;
|
||||||
|
gamelog.append("The map is revealed to you!");
|
||||||
|
|
||||||
|
*runstate = RunState::MagicMapReveal { row: 0 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If the item heals, apply the healing
|
// If the item heals, apply the healing
|
||||||
match healing.get(useitem.item) {
|
match healing.get(useitem.item) {
|
||||||
None => {}
|
None => {}
|
||||||
|
25
src/main.rs
25
src/main.rs
@ -63,6 +63,9 @@ pub enum RunState {
|
|||||||
NextLevel,
|
NextLevel,
|
||||||
ShowRemoveItem,
|
ShowRemoveItem,
|
||||||
GameOver,
|
GameOver,
|
||||||
|
MagicMapReveal {
|
||||||
|
row: i32,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct State {
|
pub struct State {
|
||||||
@ -160,7 +163,13 @@ impl GameState for State {
|
|||||||
RunState::PlayerTurn => {
|
RunState::PlayerTurn => {
|
||||||
self.run_systems();
|
self.run_systems();
|
||||||
self.ecs.maintain();
|
self.ecs.maintain();
|
||||||
newrunstate = RunState::MonsterTurn;
|
|
||||||
|
match *self.ecs.fetch::<RunState>() {
|
||||||
|
RunState::MagicMapReveal { .. } => {
|
||||||
|
newrunstate = RunState::MagicMapReveal { row: 0 }
|
||||||
|
}
|
||||||
|
_ => newrunstate = RunState::MonsterTurn,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
RunState::MonsterTurn => {
|
RunState::MonsterTurn => {
|
||||||
self.run_systems();
|
self.run_systems();
|
||||||
@ -296,6 +305,19 @@ impl GameState for State {
|
|||||||
self.goto_next_level();
|
self.goto_next_level();
|
||||||
newrunstate = RunState::PreRun;
|
newrunstate = RunState::PreRun;
|
||||||
}
|
}
|
||||||
|
RunState::MagicMapReveal { row } => {
|
||||||
|
let mut map = self.ecs.fetch_mut::<Map>();
|
||||||
|
for x in 0..MAP_WIDTH {
|
||||||
|
let idx = map.xy_idx(x as i32, row);
|
||||||
|
map.revealed_tiles[idx] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if row as usize == MAP_HEIGHT - 1 {
|
||||||
|
newrunstate = RunState::MonsterTurn;
|
||||||
|
} else {
|
||||||
|
newrunstate = RunState::MagicMapReveal { row: row + 1 };
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -487,6 +509,7 @@ fn main() -> rltk::BError {
|
|||||||
ParticleLifetime,
|
ParticleLifetime,
|
||||||
HungerClock,
|
HungerClock,
|
||||||
ProvidesFood,
|
ProvidesFood,
|
||||||
|
MagicMapper,
|
||||||
);
|
);
|
||||||
|
|
||||||
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
|
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
|
||||||
|
@ -78,6 +78,7 @@ pub fn save_game(ecs: &mut World) {
|
|||||||
ParticleLifetime,
|
ParticleLifetime,
|
||||||
HungerClock,
|
HungerClock,
|
||||||
ProvidesFood,
|
ProvidesFood,
|
||||||
|
MagicMapper,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,6 +163,7 @@ pub fn load_game(ecs: &mut World) {
|
|||||||
ParticleLifetime,
|
ParticleLifetime,
|
||||||
HungerClock,
|
HungerClock,
|
||||||
ProvidesFood,
|
ProvidesFood,
|
||||||
|
MagicMapper,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ fn room_table(map_depth: i32) -> RandomTable {
|
|||||||
.add("Longsword", map_depth - 1)
|
.add("Longsword", map_depth - 1)
|
||||||
.add("Tower Shield", map_depth - 1)
|
.add("Tower Shield", map_depth - 1)
|
||||||
.add("Rations", 10)
|
.add("Rations", 10)
|
||||||
|
.add("Magic Mapping Scroll", 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// fills a room with stuff!
|
/// fills a room with stuff!
|
||||||
@ -99,6 +100,7 @@ pub fn spawn_room(ecs: &mut World, room: &Rect, map_depth: i32) {
|
|||||||
"Longsword" => longsword(ecs, x, y),
|
"Longsword" => longsword(ecs, x, y),
|
||||||
"Tower Shield" => tower_shield(ecs, x, y),
|
"Tower Shield" => tower_shield(ecs, x, y),
|
||||||
"Rations" => rations(ecs, x, y),
|
"Rations" => rations(ecs, x, y),
|
||||||
|
"Magic Mapping Scroll" => magic_mapping_scroll(ecs, x, y),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -299,3 +301,20 @@ fn rations(ecs: &mut World, x: i32, y: i32) {
|
|||||||
.marked::<SimpleMarker<SerializeMe>>()
|
.marked::<SimpleMarker<SerializeMe>>()
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn magic_mapping_scroll(ecs: &mut World, x: i32, y: i32) {
|
||||||
|
ecs.create_entity()
|
||||||
|
.with(Position { x, y })
|
||||||
|
.with(Renderable {
|
||||||
|
glyph: rltk::to_cp437(')'),
|
||||||
|
fg: RGB::named(rltk::CYAN3),
|
||||||
|
bg: RGB::named(rltk::BLACK),
|
||||||
|
render_order: 2,
|
||||||
|
})
|
||||||
|
.with(Name::from("Scroll of Magic Mapping"))
|
||||||
|
.with(Item {})
|
||||||
|
.with(MagicMapper {})
|
||||||
|
.with(Consumable {})
|
||||||
|
.marked::<SimpleMarker<SerializeMe>>()
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user