main.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. for r in map.rooms.iter().skip(1) {
  39. game.create_entity()
  40. .with(r.center())
  41. .with(com::Renderable {
  42. glyph: carpet::CP437::from_char('g'),
  43. color: carpet::Color::Red,
  44. })
  45. .build();
  46. }
  47. game.insert(map);
  48. game.create_entity()
  49. .with(player_start)
  50. .with(com::Player)
  51. .with(com::Renderable {
  52. glyph: carpet::CP437::from_char('@'),
  53. color: carpet::Color::Blue,
  54. })
  55. .build();
  56. {
  57. // set up all the keybindings
  58. use carpet::KeyCode::*;
  59. let none = carpet::KeyMods::NONE;
  60. game.on_key((W, none), |world| com::Motion::move_player(world, -1, 0));
  61. game.on_key((A, none), |world| com::Motion::move_player(world, 0, -1));
  62. game.on_key((S, none), |world| com::Motion::move_player(world, 1, 0));
  63. game.on_key((D, none), |world| com::Motion::move_player(world, 0, 1));
  64. }
  65. game.run_with_systems(|world| {
  66. systems::Visibility.run_now(world);
  67. systems::Draw.run_now(world);
  68. systems::Move.run_now(world);
  69. })
  70. }