/* * 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, Cursor, PresentMode, WindowLevel, WindowMode, WindowResizeConstraints, WindowResolution, }, }; //use bevy_mod_scripting::prelude::*; mod api; mod cfg; mod constants; //mod lua; mod plugins; mod runtime; mod util; /// 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 { primary_window: Some(Window { cursor: Cursor::default(), present_mode: PresentMode::Fifo, mode: WindowMode::Windowed, position: WindowPosition::Centered(MonitorSelection::Primary), resolution: WindowResolution::new(1280., 720.), title: "Laurelin".to_string(), composite_alpha_mode: CompositeAlphaMode::Auto, resize_constraints: WindowResizeConstraints { min_width: 1280., min_height: 720., max_width: 3840., max_height: 2160., }, resizable: false, decorations: true, transparent: false, focused: true, window_level: WindowLevel::Normal, canvas: None, fit_canvas_to_parent: false, prevent_default_event_handling: false, ime_enabled: false, ..Default::default() }), ..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()); 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(to_despawn: Query>, mut commands: Commands) { for entity in &to_despawn { commands.entity(entity).despawn_recursive(); } } /// Utility function to remove UI nodes, which is usually just one node /// NOTE: So, UI shows up as just nodes that don't have parents, so this /// works mighty fine, at least for now. /// MAY break something in the future, but that's why this note is here. pub fn remove_ui(mut commands: Commands, nodes: Query, Without)>) { for node in &nodes { commands.entity(node).despawn_recursive(); } }