// Support configuring Bevy lints within code. #![cfg_attr(bevy_lint, feature(register_tool), register_tool(bevy))] // Disable console on Windows for non-dev builds. #![cfg_attr(not(feature = "dev"), windows_subsystem = "windows")] mod asset_tracking; mod audio; mod demo; #[cfg(feature = "dev")] mod dev_tools; mod menus; mod screens; mod theme; use bevy::{asset::AssetMetaCheck, prelude::*, window::PrimaryWindow}; fn main() -> AppExit { App::new().add_plugins(AppPlugin).run() } pub struct AppPlugin; impl Plugin for AppPlugin { fn build(&self, app: &mut App) { // Add Bevy plugins. app.add_plugins( DefaultPlugins .set(AssetPlugin { // Wasm builds will check for meta files (that don't exist) if this isn't set. // This causes errors and even panics on web build on itch. // See https://github.com/bevyengine/bevy_github_ci_template/issues/48. meta_check: AssetMetaCheck::Never, ..default() }) .set(WindowPlugin { primary_window: Window { title: "Chain Reaction Collapse".to_string(), fit_canvas_to_parent: true, ..default() } .into(), ..default() }), ); // Add other plugins. app.add_plugins(( asset_tracking::plugin, audio::plugin, demo::plugin, #[cfg(feature = "dev")] dev_tools::plugin, menus::plugin, screens::plugin, theme::plugin, )); // Order new `AppSystems` variants by adding them here: app.configure_sets( Update, ( AppSystems::TickTimers, AppSystems::RecordInput, AppSystems::Update, ) .chain(), ); // Set up the `Pause` state. app.init_state::(); app.configure_sets(Update, PausableSystems.run_if(in_state(Pause(false)))); // Spawn the main camera. app.add_systems(Startup, spawn_camera); } } /// High-level groupings of systems for the app in the `Update` schedule. /// When adding a new variant, make sure to order it in the `configure_sets` /// call above. #[derive(SystemSet, Debug, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord)] enum AppSystems { /// Tick timers. TickTimers, /// Record player input. RecordInput, /// Do everything else (consider splitting this into further variants). Update, } /// Whether or not the game is paused. #[derive(States, Copy, Clone, Eq, PartialEq, Hash, Debug, Default)] #[states(scoped_entities)] struct Pause(pub bool); /// A system set for systems that shouldn't run while the game is paused. #[derive(SystemSet, Copy, Clone, Eq, PartialEq, Hash, Debug)] struct PausableSystems; // fn apply_screen_wrap( // window: Single<&Window, With>, // mut wrap_query: Query<&mut Transform, With>, // ) { // let size = window.size() + 256.0; // let half_size = size / 2.0; // for mut transform in &mut wrap_query { // let position = transform.translation.xy(); // let wrapped = (position + half_size).rem_euclid(size) - half_size; // transform.translation = wrapped.extend(transform.translation.z); // } // } fn spawn_camera(mut commands: Commands, window: Single<&Window, With>) { let half_size = window.size() / 2.0; commands.spawn(( Name::new("Camera"), Camera2d, Projection::Orthographic(OrthographicProjection { scale: 0.5, ..OrthographicProjection::default_2d() }), // FIXME: what do I need to transform the camera for? // Transform::from_xyz(-half_size.x, half_size.y, 0.0), )); }