You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
2.9 KiB

  1. use log::{error, info};
  2. use rand::random;
  3. use space_crush_app::{App, Error};
  4. use space_crush_common::{
  5. components::Player,
  6. misc::{init_logger, Persistence, Vfs, WorldPersistence},
  7. Dispatcher,
  8. };
  9. use specs::{Entity, World, WorldExt};
  10. fn main() -> Result<(), Error> {
  11. let vfs = Vfs::new(&["space-crush-app"])?;
  12. init_logger(&vfs, "log4rs.yml");
  13. vfs.log_info();
  14. info!("Application started");
  15. if let Err(err) = run(vfs) {
  16. error!("Error while executing application: {}", err);
  17. return Err(err);
  18. }
  19. info!("Application exited");
  20. Ok(())
  21. }
  22. fn run(vfs: Vfs) -> Result<(), Error> {
  23. info!("Application initialization");
  24. let mut world = World::new();
  25. world.insert(vfs);
  26. WorldPersistence::setup(&mut world);
  27. let mut common = Dispatcher::new(&mut world)?;
  28. let player1 = Player::builder().color((0.0, 0.5, 1.0)).build(&mut world)?;
  29. let mut app = App::new(&mut world, player1)?;
  30. create_world(&mut world, player1);
  31. info!("Application initialized");
  32. while app.is_running() {
  33. world.maintain();
  34. common.process(&world);
  35. app.process(&world)?;
  36. }
  37. Ok(())
  38. }
  39. fn create_world(world: &mut World, player_id: Entity) {
  40. use glc::matrix::Angle;
  41. use space_crush_common::components::{Asteroid, AsteroidType, Fleet, Planet, Ship, ShipType};
  42. let planets = (0..3)
  43. .map(|i| {
  44. let x = 2000.0 * (i as f32 - 1.0);
  45. let y = 0.0;
  46. Planet::builder()
  47. .position((x, y))
  48. .size(250.0)
  49. .orbit(325.0, 425.0)
  50. .owner(player_id)
  51. .build(world)
  52. .unwrap()
  53. })
  54. .collect::<Vec<_>>();
  55. for i in 0..4 {
  56. let i_x: isize = if i & 1 == 0 { -1 } else { 1 };
  57. let i_y: isize = if i & 2 == 0 { -1 } else { 1 };
  58. let x = 1000.0 * i_x as f32;
  59. let y = 1000.0 * i_y as f32;
  60. Asteroid::builder()
  61. .position((x, y))
  62. .size(100.0)
  63. .orbit(125.0, 175.0)
  64. .type_(match i_x * i_y {
  65. -1 => AsteroidType::Metal,
  66. 1 => AsteroidType::Crystal,
  67. _ => unreachable!(),
  68. })
  69. .build(world)
  70. .unwrap();
  71. }
  72. let fleet_id = Fleet::builder()
  73. .player(player_id)
  74. .orbiting(planets[1])
  75. .build(world)
  76. .unwrap();
  77. for i in 0..9 {
  78. let r = 325.0 + 100.0 * random::<f32>();
  79. let a = Angle::Deg(360.0 * random::<f32>());
  80. let x = r * a.cos();
  81. let y = r * a.sin();
  82. Ship::builder()
  83. .player(player_id)
  84. .fleet(fleet_id)
  85. .position((x, y))
  86. .type_(match i % 3 {
  87. 0 => ShipType::Fighter,
  88. 1 => ShipType::Bomber,
  89. 2 => ShipType::Transporter,
  90. _ => unreachable!(),
  91. })
  92. .build(world)
  93. .unwrap();
  94. }
  95. }