|
- use log::{error, info};
- use rand::random;
- use space_crush_app::{App, Error};
- use space_crush_common::{
- components::Player,
- misc::{init_logger, Persistence, Vfs, WorldPersistence},
- Dispatcher,
- };
- use specs::{Entity, World, WorldExt};
-
- fn main() -> Result<(), Error> {
- let vfs = Vfs::new(&["space-crush-app"])?;
-
- init_logger(&vfs, "log4rs.yml");
-
- vfs.log_info();
-
- info!("Application started");
-
- if let Err(err) = run(vfs) {
- error!("Error while executing application: {}", err);
-
- return Err(err);
- }
-
- info!("Application exited");
-
- Ok(())
- }
-
- fn run(vfs: Vfs) -> Result<(), Error> {
- info!("Application initialization");
-
- let mut world = World::new();
- world.insert(vfs);
- WorldPersistence::setup(&mut world);
-
- let mut common = Dispatcher::new(&mut world)?;
- let player1 = Player::builder().color((0.0, 0.5, 1.0)).build(&mut world)?;
- let mut app = App::new(&mut world, player1)?;
-
- create_world(&mut world, player1);
-
- info!("Application initialized");
-
- while app.is_running() {
- world.maintain();
-
- common.process(&world);
- app.process(&world)?;
- }
-
- Ok(())
- }
-
- fn create_world(world: &mut World, player_id: Entity) {
- use glc::matrix::Angle;
- use space_crush_common::components::{Asteroid, AsteroidType, Fleet, Planet, Ship, ShipType};
-
- let planets = (0..3)
- .map(|i| {
- let x = 2000.0 * (i as f32 - 1.0);
- let y = 0.0;
-
- Planet::builder()
- .position((x, y))
- .size(250.0)
- .orbit(325.0, 425.0)
- .owner(player_id)
- .build(world)
- .unwrap()
- })
- .collect::<Vec<_>>();
-
- for i in 0..4 {
- let i_x: isize = if i & 1 == 0 { -1 } else { 1 };
- let i_y: isize = if i & 2 == 0 { -1 } else { 1 };
-
- let x = 1000.0 * i_x as f32;
- let y = 1000.0 * i_y as f32;
-
- Asteroid::builder()
- .position((x, y))
- .size(100.0)
- .orbit(125.0, 175.0)
- .type_(match i_x * i_y {
- -1 => AsteroidType::Metal,
- 1 => AsteroidType::Crystal,
- _ => unreachable!(),
- })
- .build(world)
- .unwrap();
- }
-
- let fleet_id = Fleet::builder()
- .player(player_id)
- .orbiting(planets[1])
- .build(world)
- .unwrap();
-
- for i in 0..9 {
- let r = 325.0 + 100.0 * random::<f32>();
- let a = Angle::Deg(360.0 * random::<f32>());
-
- let x = r * a.cos();
- let y = r * a.sin();
-
- Ship::builder()
- .player(player_id)
- .fleet(fleet_id)
- .position((x, y))
- .type_(match i % 3 {
- 0 => ShipType::Fighter,
- 1 => ShipType::Bomber,
- 2 => ShipType::Transporter,
- _ => unreachable!(),
- })
- .build(world)
- .unwrap();
- }
- }
|