/*
* This file is part of sdbclient
* Copyright (C) 2022 Jonni Liljamo <jonni@liljamo.com>
*
* Licensed under GPL-3.0-only.
* See LICENSE for licensing information.
*/
use bevy::{
prelude::*,
window::{CompositeAlphaMode, CursorGrabMode, PresentMode, WindowResizeConstraints},
};
use bevy_console::{ConsoleConfiguration, ConsolePlugin, ToggleConsoleKey};
use bevy_egui::EguiPlugin;
use bevy_inspector_egui::WorldInspectorPlugin;
mod api;
mod cfg;
mod plugins;
mod util;
/// Used to control the state of the game
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub enum GameState {
Splash,
MainMenu,
Game,
}
// Input structs
/// Login inputs
#[derive(Resource, Debug, Component, PartialEq, Eq, Clone)]
pub struct InputsUserLogin(String, String);
/// Register inputs
#[derive(Resource, Debug, Component, PartialEq, Eq, Clone)]
pub struct InputsUserRegister(String, String, String, String);
fn main() {
let mut app = App::new();
app.add_plugins(DefaultPlugins.set(WindowPlugin {
window: WindowDescriptor {
width: 1280.,
height: 720.,
position: WindowPosition::Centered,
monitor: MonitorSelection::Primary,
resize_constraints: WindowResizeConstraints {
min_width: 1280.,
min_height: 720.,
max_width: 3840.,
max_height: 2160.,
},
scale_factor_override: Some(1.),
title: "Deck Builder".to_string(),
present_mode: PresentMode::Fifo,
resizable: false,
decorations: true,
cursor_visible: true,
cursor_grab_mode: CursorGrabMode::None,
mode: WindowMode::Windowed,
transparent: false,
canvas: None,
fit_canvas_to_parent: false,
alpha_mode: CompositeAlphaMode::Auto,
},
..Default::default()
}));
app.add_plugin(EguiPlugin);
app.add_plugin(WorldInspectorPlugin::new());
app.add_plugin(ConsolePlugin);
app.insert_resource(ConsoleConfiguration {
keys: vec![
ToggleConsoleKey::KeyCode(KeyCode::F1),
ToggleConsoleKey::KeyCode(KeyCode::F13),
],
..Default::default()
});
app.insert_resource(cfg::CfgDirs(
directories::ProjectDirs::from("com", "liljamo", "deckbuilder")
.expect("failed to get project directories"),
));
app.insert_resource(cfg::CfgSettings {
volume_master: 7,
fullscreen: false,
resolution: (1280., 720.),
})
.insert_resource(cfg::CfgUser {
logged_in: false,
user_token: "".to_string(),
id: "".to_string(),
username: "".to_string(),
email: "".to_string(),
})
.insert_resource(cfg::CfgHidden {
api_server: "http://localhost:8080/api".to_string(),
})
.insert_resource(InputsUserLogin("".to_string(), "".to_string()))
.insert_resource(InputsUserRegister(
"".to_string(),
"".to_string(),
"".to_string(),
"".to_string(),
));
app.add_startup_system(setup).add_state(GameState::Splash);
app.add_plugin(plugins::connection_check::ConnectionCheckPlugin)
.add_plugin(plugins::splash::SplashPlugin)
.add_plugin(plugins::menu::MenuPlugin);
app.run();
}
fn setup(mut commands: Commands) {
// Spawn a camera
commands.spawn(Camera3dBundle::default());
}
/// Utility function do despawn an entity and all its children
pub fn despawn_screen<T: Component>(to_despawn: Query<Entity, With<T>>, mut commands: Commands) {
for entity in &to_despawn {
commands.entity(entity).despawn_recursive();
}
}