extern crate termion; #[macro_use] extern crate log; extern crate config; extern crate log4rs; extern crate serde; extern crate toml; #[macro_use] extern crate serde_derive; extern crate serde_json; #[macro_use] extern crate clap; #[macro_use] extern crate prettytable; #[macro_use] extern crate lazy_static; #[cfg(test)] #[macro_use] extern crate maplit; #[macro_use] extern crate downcast_rs; extern crate backtrace; #[macro_use] extern crate include_dir; #[macro_use] extern crate nom; #[macro_use] extern crate matches; #[macro_use] mod util; #[macro_use] mod types; #[macro_use] mod entities; mod display; mod game; mod level_gen; mod messages; mod settings; use clap::App; use game::Game; use prettytable::format::consts::FORMAT_BOX_CHARS; use rand::rngs::SmallRng; use rand::SeedableRng; use settings::Settings; use backtrace::Backtrace; use std::io::{self, StdinLock, StdoutLock}; use std::panic; use termion::raw::IntoRawMode; use termion::raw::RawTerminal; fn init( settings: Settings, stdout: RawTerminal>, stdin: StdinLock<'_>, w: u16, h: u16, ) { panic::set_hook(if settings.logging.print_backtrace { Box::new(|info| (error!("{}\n{:#?}", info, Backtrace::new()))) } else { Box::new(|info| (error!("{}\n{:#?}", info, Backtrace::new()))) }); let game = Game::new(settings, stdout, stdin, w, h); game.run().unwrap() } fn main() { let yaml = load_yaml!("cli.yml"); let matches = App::from_yaml(yaml).get_matches(); let settings = Settings::load().unwrap(); settings.logging.init_log(); let stdout = io::stdout(); let mut stdout = stdout.lock(); let stdin = io::stdin(); let stdin = stdin.lock(); let termsize = termion::terminal_size().ok(); let (termwidth, termheight) = termsize.unwrap_or((70, 40)); match matches.subcommand() { ("debug", _) => { let mut table = table!( [br->"termwidth", termwidth], [br->"termheight", termheight], [br->"logfile", settings.logging.file], [br->"loglevel", settings.logging.level] ); table.set_format(*FORMAT_BOX_CHARS); table.printstd(); } ("generate-level", params) => { let params = params.unwrap(); let mut rand = SmallRng::from_entropy(); let level = match params.value_of("generator") { None => panic!("Must supply a generator with --generator"), Some("cave_automata") => level_gen::cave_automata::generate( &Default::default(), &mut rand, ), Some(gen) => panic!("Unrecognized generator: {}", gen), }; level_gen::display::print_generated_level(&level, &mut stdout) .unwrap(); } _ => { let stdout = stdout.into_raw_mode().unwrap(); init(settings, stdout, stdin, termwidth, termheight); } } }