main.rs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #[macro_use]
  2. extern crate specs_derive;
  3. #[macro_use]
  4. extern crate specs_system_macro;
  5. mod components;
  6. mod map;
  7. mod systems;
  8. use ggez::GameError;
  9. use specs::prelude::{Builder, RunNow};
  10. use components as com;
  11. fn main() -> Result<(), GameError> {
  12. let mut game: carpet::Game<carpet::CP437> = carpet::GameBuilder::new()
  13. .name("game")
  14. .author("me")
  15. .resource_path({
  16. let base = std::env::var("CARGO_MANIFEST_DIR").unwrap();
  17. let mut path = std::path::PathBuf::from(base);
  18. path.pop();
  19. path.push("resources");
  20. path
  21. })
  22. .tileset("/haberdash.gif", [12, 12])
  23. .map_size(80, 50)
  24. .build()?;
  25. game.register::<carpet::Coord>();
  26. game.register::<com::Renderable>();
  27. game.register::<com::Motion>();
  28. game.register::<com::Player>();
  29. let map = map::Map::new();
  30. let player_start = map
  31. .rooms
  32. .first()
  33. .map(|r| r.center())
  34. .unwrap_or_else(|| [40, 25].into());
  35. let mut vs = carpet::Viewshed::create(&map.tiles, map::Cell::blocks_view);
  36. vs.range = Some(20);
  37. game.insert(map::Viewshed { vs, dirty: true });
  38. game.insert(map);
  39. game.create_entity()
  40. .with(player_start)
  41. .with(com::Player)
  42. .with(com::Renderable {
  43. glyph: carpet::CP437::from_char('@'),
  44. color: carpet::Color::Blue,
  45. })
  46. .build();
  47. {
  48. // set up all the keybindings
  49. use carpet::KeyCode::*;
  50. let none = carpet::KeyMods::NONE;
  51. game.on_key((W, none), |world| com::Motion::move_player(world, -1, 0));
  52. game.on_key((A, none), |world| com::Motion::move_player(world, 0, -1));
  53. game.on_key((S, none), |world| com::Motion::move_player(world, 1, 0));
  54. game.on_key((D, none), |world| com::Motion::move_player(world, 0, 1));
  55. }
  56. game.run_with_systems(|world| {
  57. systems::Visibility.run_now(world);
  58. systems::Draw.run_now(world);
  59. systems::Move.run_now(world);
  60. })
  61. }