This commit is contained in:
Benjamyn Love 2022-12-03 21:06:41 +11:00
parent 5254209c35
commit 49562d62a6
2 changed files with 67 additions and 41 deletions

View File

@ -39,7 +39,6 @@ pub use gamelog::*;
mod spawner; mod spawner;
mod inventory_system; mod inventory_system;
use inventory_system::*; use inventory_system::*;
@ -52,8 +51,13 @@ pub enum RunState {
ShowInventory, ShowInventory,
ShowDropItem, ShowDropItem,
ShowSpawnMenu, ShowSpawnMenu,
ShowTargeting { range : i32, item : Entity}, ShowTargeting {
MainMenu { menu_selection : gui::MainMenuSelection }, range: i32,
item: Entity,
},
MainMenu {
menu_selection: gui::MainMenuSelection,
},
SaveGame, SaveGame,
} }
@ -216,20 +220,24 @@ impl GameState for State {
RunState::MainMenu { .. } => { RunState::MainMenu { .. } => {
let result = gui::main_menu(self, ctx); let result = gui::main_menu(self, ctx);
match result { match result {
gui::MainMenuResult::NoSelection { selected } => newrunstate = RunState::MainMenu{menu_selection: selected}, gui::MainMenuResult::NoSelection { selected } => {
gui::MainMenuResult::Selected { selected } => { newrunstate = RunState::MainMenu {
match selected { menu_selection: selected,
gui::MainMenuSelection::NewGame => newrunstate = RunState::PreRun,
gui::MainMenuSelection::LoadGame => newrunstate = RunState::PreRun,
gui::MainMenuSelection::Quit => { ::std::process::exit(0)}
} }
} }
gui::MainMenuResult::Selected { selected } => match selected {
gui::MainMenuSelection::NewGame => newrunstate = RunState::PreRun,
gui::MainMenuSelection::LoadGame => newrunstate = RunState::PreRun,
gui::MainMenuSelection::Quit => ::std::process::exit(0),
},
} }
} }
RunState::SaveGame => { RunState::SaveGame => {
let data = serde_json::to_string(&*self.ecs.fetch::<Map>()).unwrap(); let data = serde_json::to_string(&*self.ecs.fetch::<Map>()).unwrap();
println!("{}", data); println!("{}", data);
newrunstate = RunState::MainMenu { menu_selection: gui::MainMenuSelection::LoadGame }; newrunstate = RunState::MainMenu {
menu_selection: gui::MainMenuSelection::LoadGame,
};
} }
} }
@ -272,6 +280,8 @@ fn main() -> rltk::BError {
gs.ecs.register::<Confusion>(); gs.ecs.register::<Confusion>();
gs.ecs.register::<SimpleMarker<SerializeMe>>(); gs.ecs.register::<SimpleMarker<SerializeMe>>();
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
let map = Map::new_map_rooms_and_corridors(); let map = Map::new_map_rooms_and_corridors();
let (player_x, player_y) = map.rooms[0].center(); let (player_x, player_y) = map.rooms[0].center();
@ -286,11 +296,12 @@ fn main() -> rltk::BError {
gs.ecs.insert(map); gs.ecs.insert(map);
gs.ecs.insert(player_entity); gs.ecs.insert(player_entity);
gs.ecs.insert(RunState::MainMenu { menu_selection: MainMenuSelection::NewGame }); gs.ecs.insert(RunState::MainMenu {
menu_selection: MainMenuSelection::NewGame,
});
gs.ecs.insert(gamelog::GameLog { gs.ecs.insert(gamelog::GameLog {
entries: vec!["Welcome to my rougelike".to_string()], entries: vec!["Welcome to my rougelike".to_string()],
}); });
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
// Main loop runner // Main loop runner
rltk::main_loop(context, gs) rltk::main_loop(context, gs)

View File

@ -1,11 +1,14 @@
use crate::AreaOfEffect; use crate::{AreaOfEffect, SerializeMe};
use super::{ use super::{
BlocksTile, CombatStats, Item, Monster, Name, Player, Position, ProvidesHealing, Rect, BlocksTile, CombatStats, Confusion, Consumable, InflictsDamage, Item, Monster, Name, Player,
Renderable, Viewshed, InflictsDamage, MAPWIDTH, Ranged, Consumable, Confusion Position, ProvidesHealing, Ranged, Rect, Renderable, Viewshed, MAPWIDTH,
}; };
use rltk::{RandomNumberGenerator, RGB}; use rltk::{RandomNumberGenerator, RGB};
use specs::prelude::*; use specs::{
prelude::*,
saveload::{MarkedBuilder, SimpleMarker},
};
const MAX_MONSTERS: i32 = 4; const MAX_MONSTERS: i32 = 4;
const MAX_ITEMS: i32 = 2; const MAX_ITEMS: i32 = 2;
@ -38,6 +41,7 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity {
defence: 2, defence: 2,
power: 5, power: 5,
}) })
.marked::<SimpleMarker<SerializeMe>>()
.build() .build()
} }
@ -54,16 +58,16 @@ pub fn random_monster(ecs: &mut World, x: i32, y: i32) {
} }
fn random_item(ecs: &mut World, x: i32, y: i32) { fn random_item(ecs: &mut World, x: i32, y: i32) {
let roll :i32; let roll: i32;
{ {
let mut rng = ecs.write_resource::<RandomNumberGenerator>(); let mut rng = ecs.write_resource::<RandomNumberGenerator>();
roll = rng.roll_dice(1, 4); roll = rng.roll_dice(1, 4);
} }
match roll { match roll {
1 => { health_potion(ecs, x, y) } 1 => health_potion(ecs, x, y),
2 => { fireball_scroll(ecs, x, y) } 2 => fireball_scroll(ecs, x, y),
3 => { confusion_scroll(ecs, x, y)} 3 => confusion_scroll(ecs, x, y),
_ => { magic_missile_scroll(ecs, x, y) } _ => magic_missile_scroll(ecs, x, y),
} }
} }
@ -99,6 +103,7 @@ fn monster<S: ToString>(ecs: &mut World, x: i32, y: i32, glyph: rltk::FontCharTy
defence: 1, defence: 1,
power: 4, power: 4,
}) })
.marked::<SimpleMarker<SerializeMe>>()
.build(); .build();
} }
@ -166,23 +171,27 @@ pub fn health_potion(ecs: &mut World, x: i32, y: i32) {
.with(Item {}) .with(Item {})
.with(Consumable {}) .with(Consumable {})
.with(ProvidesHealing { heal_amount: 8 }) .with(ProvidesHealing { heal_amount: 8 })
.marked::<SimpleMarker<SerializeMe>>()
.build(); .build();
} }
pub fn magic_missile_scroll(ecs: &mut World, x: i32, y: i32) { pub fn magic_missile_scroll(ecs: &mut World, x: i32, y: i32) {
ecs.create_entity() ecs.create_entity()
.with(Position{ x, y }) .with(Position { x, y })
.with(Renderable{ .with(Renderable {
glyph: rltk::to_cp437(')'), glyph: rltk::to_cp437(')'),
fg: RGB::named(rltk::CYAN), fg: RGB::named(rltk::CYAN),
bg: RGB::named(rltk::BLACK), bg: RGB::named(rltk::BLACK),
render_order: 2 render_order: 2,
}) })
.with(Name{ name: "Magic Missile Scroll".to_string() }) .with(Name {
.with(Item{}) name: "Magic Missile Scroll".to_string(),
.with(Consumable{}) })
.with(Ranged{ range: 6 }) .with(Item {})
.with(InflictsDamage{ damage: 8 }) .with(Consumable {})
.with(Ranged { range: 6 })
.with(InflictsDamage { damage: 8 })
.marked::<SimpleMarker<SerializeMe>>()
.build(); .build();
} }
@ -193,30 +202,36 @@ pub fn fireball_scroll(ecs: &mut World, x: i32, y: i32) {
glyph: rltk::to_cp437(')'), glyph: rltk::to_cp437(')'),
fg: RGB::named(rltk::ORANGE), fg: RGB::named(rltk::ORANGE),
bg: RGB::named(rltk::BLACK), bg: RGB::named(rltk::BLACK),
render_order: 2 render_order: 2,
})
.with(Name {
name: "Fireball Scroll".to_string(),
}) })
.with(Name{ name: "Fireball Scroll".to_string() })
.with(Item {}) .with(Item {})
.with(Consumable {}) .with(Consumable {})
.with(Ranged { range: 6 }) .with(Ranged { range: 6 })
.with(InflictsDamage{ damage: 20 }) .with(InflictsDamage { damage: 20 })
.with(AreaOfEffect { radius: 3 }) .with(AreaOfEffect { radius: 3 })
.marked::<SimpleMarker<SerializeMe>>()
.build(); .build();
} }
pub fn confusion_scroll(ecs: &mut World, x: i32, y: i32) { pub fn confusion_scroll(ecs: &mut World, x: i32, y: i32) {
ecs.create_entity() ecs.create_entity()
.with(Position{ x, y }) .with(Position { x, y })
.with(Renderable{ .with(Renderable {
glyph: rltk::to_cp437(')'), glyph: rltk::to_cp437(')'),
fg: RGB::named(rltk::PINK), fg: RGB::named(rltk::PINK),
bg: RGB::named(rltk::BLACK), bg: RGB::named(rltk::BLACK),
render_order: 2 render_order: 2,
}) })
.with(Name{ name: "Confusion Scroll".to_string() }) .with(Name {
.with(Item{}) name: "Confusion Scroll".to_string(),
.with(Consumable{}) })
.with(Ranged{ range: 6 }) .with(Item {})
.with(Confusion{ turns: 4}) .with(Consumable {})
.with(Ranged { range: 6 })
.with(Confusion { turns: 4 })
.marked::<SimpleMarker<SerializeMe>>()
.build(); .build();
} }