/* * This file is part of laurelin/client * Copyright (C) 2023 Jonni Liljamo * * 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_inspector_egui::quick::WorldInspectorPlugin; use iyes_loopless::prelude::*; use naia_bevy_client::{ Client as NaiaClient, ClientConfig as NaiaClientConfig, Plugin as NaiaClientPlugin, }; use laurelin_shared::server::protocol::protocol; mod cfg; mod constants; mod plugins; mod runtime; mod util; // NOTE: lua things, currently not in use //use bevy_mod_scripting::prelude::*; //mod lua; /// Used to control the state of the game #[derive(Debug, Clone, Eq, PartialEq, Hash)] pub enum GameState { Splash, Loading, MainMenu, Game, } 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(WorldInspectorPlugin); app.add_plugin(ConsolePlugin); app.insert_resource(ConsoleConfiguration { keys: vec![ ToggleConsoleKey::KeyCode(KeyCode::F1), ToggleConsoleKey::KeyCode(KeyCode::F13), ], ..Default::default() }); //app.add_plugin(ScriptingPlugin).add_plugin(lua::LuaPlugin); app.insert_resource(cfg::CfgDirs( directories::ProjectDirs::from("com", "liljamo", "deckbuilder") .expect("failed to get project directories"), )); app.insert_resource(cfg::CfgSettings::default()) .insert_resource(cfg::CfgUser::default()) .insert_resource(cfg::CfgDev::default()); app.add_startup_system(setup) .add_loopless_state(GameState::Splash); app.add_plugin(plugins::config::ConfigPlugin) .add_plugin(plugins::phases::splash::SplashPlugin) .add_plugin(plugins::phases::loading::LoadingPlugin) .add_plugin(plugins::menu::MenuPlugin); // Lastly, add in runtime data structs app.insert_resource(runtime::menu::RTDMenu::default()) .insert_resource(runtime::game::RTDGame::default()); // Networking app.add_plugin(NaiaClientPlugin::new( NaiaClientConfig::default(), protocol(), )) .add_plugin(plugins::networking::NetworkingPlugin); app.run(); } fn init_networking(mut commands: Commands, mut client: NaiaClient) { info!("Laurelin client connecting"); // TODO: un-hardcode this client.connect("http://127.0.0.1:14191"); } 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(to_despawn: Query>, mut commands: Commands) { for entity in &to_despawn { commands.entity(entity).despawn_recursive(); } }