2024-04-21 18:23:40 +02:00
|
|
|
// ▄████████▄ + ███ + ▄█████████ ███ +
|
|
|
|
// ███▀ ▀███ + + ███ ███▀ + ███ + +
|
|
|
|
// ███ + ███ ███ ███ █████████ ███ ███ ███ ███
|
2024-04-21 19:34:00 +02:00
|
|
|
// ███ +███ ███ ███ ███ ███▐██████ ███ ███ ███
|
2024-04-21 18:23:40 +02:00
|
|
|
// ███ + ███ ███+ ███ +███ ███ + ███ ███ + ███
|
|
|
|
// ███▄ ▄███ ███▄ ███ ███ + ███ + ███ ███▄ ███
|
|
|
|
// ▀████████▀ + ▀███████ ███▄ ███▄ ▀████ ▀███████
|
|
|
|
// + + + ███
|
|
|
|
// + ▀████████████████████████████████████████████████████▀
|
2024-04-23 17:33:36 +02:00
|
|
|
//
|
|
|
|
// This module initializes the game, handles command-line arguments,
|
|
|
|
// and manages window-related key bindings.
|
2024-04-21 18:23:40 +02:00
|
|
|
|
2024-05-12 23:42:56 +02:00
|
|
|
pub mod actor;
|
|
|
|
pub mod audio;
|
|
|
|
pub mod camera;
|
|
|
|
pub mod chat;
|
|
|
|
pub mod cmd;
|
2024-05-13 00:44:03 +02:00
|
|
|
pub mod common;
|
2024-05-12 23:57:21 +02:00
|
|
|
pub mod game;
|
2024-05-12 23:42:56 +02:00
|
|
|
pub mod hud;
|
|
|
|
pub mod load;
|
|
|
|
pub mod menu;
|
2024-05-12 23:44:10 +02:00
|
|
|
#[allow(dead_code)]
|
|
|
|
pub mod nature;
|
2024-05-12 23:42:56 +02:00
|
|
|
pub mod var;
|
|
|
|
pub mod visual;
|
|
|
|
pub mod world;
|
2024-03-16 20:53:57 +01:00
|
|
|
|
2024-05-12 21:06:38 +02:00
|
|
|
pub mod prelude {
|
2024-05-13 00:44:03 +02:00
|
|
|
pub use crate::common::*;
|
2024-05-12 21:06:38 +02:00
|
|
|
pub use crate::load::load_asset;
|
2024-09-22 03:10:11 +02:00
|
|
|
pub use crate::var::{Preferences, Settings};
|
2024-05-22 04:57:20 +02:00
|
|
|
pub use crate::{
|
|
|
|
actor, audio, camera, chat, cmd, common, game, hud, load, menu, nature, var, visual, world,
|
|
|
|
};
|
2024-06-13 03:26:19 +02:00
|
|
|
pub use game::Cycle::Next;
|
2024-06-17 01:16:53 +02:00
|
|
|
pub use game::Turn::Toggle;
|
2024-05-22 04:57:20 +02:00
|
|
|
pub use game::{GameEvent, Turn};
|
2024-05-12 21:06:38 +02:00
|
|
|
}
|
|
|
|
|
2024-03-18 04:41:52 +01:00
|
|
|
use bevy::diagnostic::FrameTimeDiagnosticsPlugin;
|
2024-03-16 21:44:51 +01:00
|
|
|
use bevy::prelude::*;
|
2024-05-22 04:57:20 +02:00
|
|
|
use bevy::window::{CursorGrabMode, PrimaryWindow, Window, WindowMode};
|
2024-03-28 22:34:16 +01:00
|
|
|
use std::env;
|
2024-03-16 15:00:31 +01:00
|
|
|
|
2024-04-25 03:23:30 +02:00
|
|
|
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.";
|
|
|
|
|
2024-03-16 14:27:22 +01:00
|
|
|
fn main() {
|
2024-04-30 23:41:37 +02:00
|
|
|
let prefs = var::load_prefs();
|
2024-05-13 20:21:56 +02:00
|
|
|
let mut opt = var::CommandLineOptions {
|
2024-04-30 23:41:37 +02:00
|
|
|
window_mode_fullscreen: prefs.get_fullscreen_mode(),
|
|
|
|
window_mode_initial: prefs.get_window_mode(),
|
|
|
|
use_gl: prefs.render_mode_is_gl(),
|
2024-04-25 03:23:30 +02:00
|
|
|
};
|
|
|
|
|
2024-03-28 22:34:16 +01:00
|
|
|
let args: Vec<String> = env::args().collect();
|
|
|
|
if args.len() > 1 {
|
2024-04-25 02:37:45 +02:00
|
|
|
for arg in &args[1..] {
|
2024-04-25 03:23:30 +02:00
|
|
|
if arg == "--help" || arg == "-h" {
|
|
|
|
println!("{}", HELP);
|
|
|
|
return;
|
2024-05-22 04:57:20 +02:00
|
|
|
} else if arg == "--version" || arg == "-v" {
|
2024-04-25 02:37:45 +02:00
|
|
|
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;
|
2024-05-22 04:57:20 +02:00
|
|
|
} else if arg == "--gl" {
|
2024-04-30 23:41:37 +02:00
|
|
|
opt.use_gl = true;
|
2024-05-22 04:57:20 +02:00
|
|
|
} else if arg == "--windowed" {
|
2024-04-25 03:23:30 +02:00
|
|
|
opt.window_mode_initial = WindowMode::Windowed;
|
2024-05-22 04:57:20 +02:00
|
|
|
} else if arg == "--fs-legacy" {
|
2024-04-25 03:23:30 +02:00
|
|
|
let mode = WindowMode::Fullscreen;
|
|
|
|
if opt.window_mode_initial == opt.window_mode_fullscreen {
|
|
|
|
opt.window_mode_initial = mode;
|
|
|
|
}
|
|
|
|
opt.window_mode_fullscreen = mode;
|
2024-05-22 04:57:20 +02:00
|
|
|
} else if arg == "--fs-sized" {
|
2024-04-25 03:23:30 +02:00
|
|
|
let mode = WindowMode::SizedFullscreen;
|
|
|
|
if opt.window_mode_initial == opt.window_mode_fullscreen {
|
|
|
|
opt.window_mode_initial = mode;
|
|
|
|
}
|
|
|
|
opt.window_mode_fullscreen = mode;
|
2024-05-22 04:57:20 +02:00
|
|
|
} else {
|
2024-04-25 03:23:30 +02:00
|
|
|
println!("{}", HELP);
|
|
|
|
println!("\nERROR: no such option: `{}`", arg);
|
|
|
|
return;
|
|
|
|
}
|
2024-03-28 22:34:16 +01:00
|
|
|
}
|
|
|
|
}
|
2024-04-30 23:41:37 +02:00
|
|
|
if opt.use_gl {
|
|
|
|
env::set_var("WGPU_BACKEND", "gl");
|
|
|
|
}
|
|
|
|
|
2024-06-13 00:43:01 +02:00
|
|
|
dbg!(&prefs);
|
|
|
|
|
2024-04-23 15:39:46 +02:00
|
|
|
let mut app = App::new();
|
2024-04-25 03:23:30 +02:00
|
|
|
app.insert_resource(opt);
|
|
|
|
|
2024-04-23 15:39:46 +02:00
|
|
|
#[cfg(feature = "embed_assets")]
|
|
|
|
app.add_plugins(bevy_embedded_assets::EmbeddedAssetPlugin {
|
2024-05-22 04:57:20 +02:00
|
|
|
mode: bevy_embedded_assets::PluginMode::ReplaceDefault,
|
2024-04-23 15:39:46 +02:00
|
|
|
});
|
2024-04-25 03:23:30 +02:00
|
|
|
|
2024-10-10 01:23:04 +02:00
|
|
|
// 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),
|
|
|
|
),
|
|
|
|
});
|
|
|
|
|
2024-04-30 23:41:37 +02:00
|
|
|
app.add_plugins(OutFlyPlugin);
|
|
|
|
app.insert_resource(prefs);
|
|
|
|
app.run();
|
2024-03-18 00:04:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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((
|
2024-05-22 04:57:20 +02:00
|
|
|
DefaultPlugins, //.set(ImagePlugin::default_nearest()),
|
2024-03-18 00:04:23 +01:00
|
|
|
FrameTimeDiagnosticsPlugin,
|
2024-03-17 23:49:50 +01:00
|
|
|
actor::ActorPlugin,
|
2024-03-18 00:04:23 +01:00
|
|
|
audio::AudioPlugin,
|
2024-04-04 13:33:54 +02:00
|
|
|
camera::CameraPlugin,
|
|
|
|
chat::ChatPlugin,
|
2024-05-12 23:37:03 +02:00
|
|
|
cmd::CmdPlugin,
|
2024-05-12 23:57:21 +02:00
|
|
|
game::GamePlugin,
|
2024-05-12 22:17:17 +02:00
|
|
|
menu::MenuPlugin,
|
2024-05-10 10:37:40 +02:00
|
|
|
visual::VisualPlugin,
|
2024-04-04 13:33:54 +02:00
|
|
|
hud::HudPlugin,
|
2024-05-10 10:27:52 +02:00
|
|
|
load::LoadPlugin,
|
2024-04-04 13:33:54 +02:00
|
|
|
world::WorldPlugin,
|
2024-03-18 00:04:23 +01:00
|
|
|
));
|
|
|
|
}
|
2024-03-16 15:00:31 +01:00
|
|
|
}
|
|
|
|
|
2024-05-22 04:57:20 +02:00
|
|
|
fn setup(mut windows: Query<&mut Window, With<PrimaryWindow>>, opt: Res<var::CommandLineOptions>) {
|
2024-03-16 19:07:28 +01:00
|
|
|
for mut window in &mut windows {
|
|
|
|
window.cursor.grab_mode = CursorGrabMode::Locked;
|
|
|
|
window.cursor.visible = false;
|
2024-04-25 03:23:30 +02:00
|
|
|
window.mode = opt.window_mode_initial;
|
2024-05-14 22:41:02 +02:00
|
|
|
window.title = common::GAME_NAME.to_string();
|
2024-03-16 19:07:28 +01:00
|
|
|
}
|
2024-03-16 16:22:44 +01:00
|
|
|
}
|
|
|
|
|
2024-03-16 16:12:35 +01:00
|
|
|
fn handle_input(
|
|
|
|
keyboard_input: Res<ButtonInput<KeyCode>>,
|
2024-04-14 14:55:00 +02:00
|
|
|
settings: Res<var::Settings>,
|
2024-04-25 03:52:32 +02:00
|
|
|
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
|
2024-05-13 20:25:25 +02:00
|
|
|
mut ew_game: EventWriter<game::GameEvent>,
|
2024-03-16 16:12:35 +01:00
|
|
|
) {
|
2024-04-08 00:23:55 +02:00
|
|
|
if keyboard_input.just_pressed(settings.key_fullscreen) {
|
2024-04-25 03:52:32 +02:00
|
|
|
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::Click));
|
2024-05-13 20:25:25 +02:00
|
|
|
ew_game.send(game::GameEvent::SetFullscreen(game::Turn::Toggle));
|
2024-04-08 00:23:55 +02:00
|
|
|
}
|
2024-03-16 15:13:00 +01:00
|
|
|
}
|