// ▄████████▄ + ███ + ▄█████████ ███ + // ███▀ ▀███ + + ███ ███▀ + ███ + + // ███ + ███ ███ ███ █████████ ███ ███ ███ ███ // ███ +███ ███ ███ ███ ███▐██████ ███ ███ ███ // ███ + ███ ███+ ███ +███ ███ + ███ ███ + ███ // ███▄ ▄███ ███▄ ███ ███ + ███ + ███ ███▄ ███ // ▀████████▀ + ▀███████ ███▄ ███▄ ▀████ ▀███████ // + + + ███ // + ▀████████████████████████████████████████████████████▀ // // This module initializes the game, handles command-line arguments, // and manages window-related key bindings. pub mod actor; pub mod audio; pub mod camera; pub mod chat; pub mod cmd; pub mod common; pub mod game; pub mod hud; pub mod load; pub mod menu; #[allow(dead_code)] pub mod nature; pub mod var; pub mod visual; pub mod world; pub mod prelude { pub use crate::common::*; pub use crate::load::load_asset; pub use crate::var::{Preferences, Settings}; pub use crate::{ actor, audio, camera, chat, cmd, common, game, hud, load, menu, nature, var, visual, world, }; pub use game::Cycle::Next; pub use game::Turn::Toggle; pub use game::{GameEvent, Turn}; } use bevy::diagnostic::FrameTimeDiagnosticsPlugin; use bevy::prelude::*; use bevy::window::{CursorGrabMode, PrimaryWindow, Window, WindowMode}; use std::env; const HELP: &str = "./outfly [options] Options: --version, -v show this program's version number and exit --help, -h show this help message and exit --gl use GL rendering instead of Vulkan --fs-legacy use 'legacy' (non-borderless) fullscreen mode --fs-sized use 'sized' (non-borderless) fullscreen mode --windowed start in non-fullscreen mode Note: borderless fullscreen is the default, but it crashes on some systems."; fn main() { let prefs = var::load_prefs(); let mut opt = var::CommandLineOptions { window_mode_fullscreen: prefs.get_fullscreen_mode(), window_mode_initial: prefs.get_window_mode(), use_gl: prefs.render_mode_is_gl(), }; let args: Vec = env::args().collect(); if args.len() > 1 { for arg in &args[1..] { if arg == "--help" || arg == "-h" { println!("{}", HELP); return; } else if arg == "--version" || arg == "-v" { let version = option_env!("CARGO_PKG_VERSION").unwrap(); let name = option_env!("CARGO_PKG_NAME").unwrap(); let homepage = option_env!("CARGO_PKG_HOMEPAGE").unwrap(); println!("{name} {version}"); println!("License: GNU GPL version 3: https://gnu.org/licenses/gpl.html"); println!("{homepage}"); return; } else if arg == "--gl" { opt.use_gl = true; } else if arg == "--windowed" { opt.window_mode_initial = WindowMode::Windowed; } else if arg == "--fs-legacy" { let mode = WindowMode::Fullscreen; if opt.window_mode_initial == opt.window_mode_fullscreen { opt.window_mode_initial = mode; } opt.window_mode_fullscreen = mode; } else if arg == "--fs-sized" { let mode = WindowMode::SizedFullscreen; if opt.window_mode_initial == opt.window_mode_fullscreen { opt.window_mode_initial = mode; } opt.window_mode_fullscreen = mode; } else { println!("{}", HELP); println!("\nERROR: no such option: `{}`", arg); return; } } } if opt.use_gl { env::set_var("WGPU_BACKEND", "gl"); } dbg!(&prefs); let mut app = App::new(); app.insert_resource(opt); #[cfg(feature = "embed_assets")] app.add_plugins(bevy_embedded_assets::EmbeddedAssetPlugin { mode: bevy_embedded_assets::PluginMode::ReplaceDefault, }); // Reduce power usage when unfocused app.insert_resource(bevy::winit::WinitSettings { focused_mode: bevy::winit::UpdateMode::Continuous, unfocused_mode: bevy::winit::UpdateMode::reactive_low_power( bevy::utils::Duration::from_secs(10), ), }); app.add_plugins(OutFlyPlugin); app.insert_resource(prefs); app.run(); } pub struct OutFlyPlugin; impl Plugin for OutFlyPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, setup); app.add_systems(Update, handle_input); app.add_plugins(( DefaultPlugins, //.set(ImagePlugin::default_nearest()), FrameTimeDiagnosticsPlugin, actor::ActorPlugin, audio::AudioPlugin, camera::CameraPlugin, chat::ChatPlugin, cmd::CmdPlugin, game::GamePlugin, menu::MenuPlugin, visual::VisualPlugin, hud::HudPlugin, load::LoadPlugin, world::WorldPlugin, )); } } fn setup(mut windows: Query<&mut Window, With>, opt: Res) { for mut window in &mut windows { window.cursor.grab_mode = CursorGrabMode::Locked; window.cursor.visible = false; window.mode = opt.window_mode_initial; window.title = common::GAME_NAME.to_string(); } } fn handle_input( keyboard_input: Res>, settings: Res, mut ew_sfx: EventWriter, mut ew_game: EventWriter, ) { if keyboard_input.just_pressed(settings.key_fullscreen) { ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::Click)); ew_game.send(game::GameEvent::SetFullscreen(game::Turn::Toggle)); } }