From e07ff07e2376e171f332b7463c29f84d63c029d8 Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Wed, 10 Dec 2025 21:46:01 -0800 Subject: [PATCH] Stubbing out shape asset loading for tetris, also fixed imports --- Cargo.lock | 72 +++++++++++---- Cargo.toml | 47 +--------- engine/Cargo.toml | 28 ++++++ {examples => engine/examples}/README.md | 0 .../examples}/demos/parallax2d.rs | 0 .../examples}/demos/parallax3d.rs | 0 {examples => engine/examples}/feathers.rs | 11 +-- {examples => engine/examples}/game2d.rs | 2 +- {examples => engine/examples}/images.rs | 2 +- {examples => engine/examples}/parallax.rs | 2 +- {examples => engine/examples}/scroll.rs | 0 .../examples}/sync_resource_to_ui.rs | 2 +- {examples => engine/examples}/ui.rs | 2 +- {examples => engine/examples}/window.rs | 2 +- {src => engine/src}/base_game.rs | 0 {src => engine/src}/debug.rs | 0 {src => engine/src}/lib.rs | 8 +- {src => engine/src}/loading.rs | 0 {src => engine/src}/parallax.rs | 0 {src => engine/src}/scheduling.rs | 0 {src => engine/src}/ui.rs | 0 {src => engine/src}/version.rs | 2 +- flappy/Cargo.toml | 10 +++ {src/bin/flappy => flappy/src}/main.rs | 4 +- hum/Cargo.toml | 6 ++ {src/bin/hum => hum/src}/main.rs | 2 +- justfile | 6 ++ physics/Cargo.toml | 14 +++ physics/src/lib.rs | 2 + {src => physics/src}/physics2d.rs | 1 + {src => physics/src}/physics3d.rs | 0 src/bin/README.md | 0 src/bin/tetris/blocks.rs | 53 ----------- src/bin/tetris/main.rs | 16 ---- tetris/Cargo.toml | 19 ++++ tetris/assets/t.shape.toml | 4 + tetris/src/blocks.rs | 90 +++++++++++++++++++ {src/bin/tetris => tetris/src}/debug.rs | 0 {src/bin/tetris => tetris/src}/fighter.rs | 0 tetris/src/main.rs | 69 ++++++++++++++ trees/Cargo.toml | 10 +++ {src/bin/trees => trees/src}/README.md | 0 {src/bin/trees => trees/src}/debug.rs | 0 {src/bin/trees => trees/src}/main.rs | 2 +- {src/bin/trees => trees/src}/mono.rs | 0 45 files changed, 336 insertions(+), 152 deletions(-) create mode 100644 engine/Cargo.toml rename {examples => engine/examples}/README.md (100%) rename {examples => engine/examples}/demos/parallax2d.rs (100%) rename {examples => engine/examples}/demos/parallax3d.rs (100%) rename {examples => engine/examples}/feathers.rs (98%) rename {examples => engine/examples}/game2d.rs (98%) rename {examples => engine/examples}/images.rs (99%) rename {examples => engine/examples}/parallax.rs (99%) rename {examples => engine/examples}/scroll.rs (100%) rename {examples => engine/examples}/sync_resource_to_ui.rs (98%) rename {examples => engine/examples}/ui.rs (99%) rename {examples => engine/examples}/window.rs (98%) rename {src => engine/src}/base_game.rs (100%) rename {src => engine/src}/debug.rs (100%) rename {src => engine/src}/lib.rs (97%) rename {src => engine/src}/loading.rs (100%) rename {src => engine/src}/parallax.rs (100%) rename {src => engine/src}/scheduling.rs (100%) rename {src => engine/src}/ui.rs (100%) rename {src => engine/src}/version.rs (56%) create mode 100644 flappy/Cargo.toml rename {src/bin/flappy => flappy/src}/main.rs (99%) create mode 100644 hum/Cargo.toml rename {src/bin/hum => hum/src}/main.rs (90%) create mode 100644 physics/Cargo.toml create mode 100644 physics/src/lib.rs rename {src => physics/src}/physics2d.rs (99%) rename {src => physics/src}/physics3d.rs (100%) delete mode 100644 src/bin/README.md delete mode 100644 src/bin/tetris/blocks.rs delete mode 100644 src/bin/tetris/main.rs create mode 100644 tetris/Cargo.toml create mode 100644 tetris/assets/t.shape.toml create mode 100644 tetris/src/blocks.rs rename {src/bin/tetris => tetris/src}/debug.rs (100%) rename {src/bin/tetris => tetris/src}/fighter.rs (100%) create mode 100644 tetris/src/main.rs create mode 100644 trees/Cargo.toml rename {src/bin/trees => trees/src}/README.md (100%) rename {src/bin/trees => trees/src}/debug.rs (100%) rename {src/bin/trees => trees/src}/main.rs (99%) rename {src/bin/trees => trees/src}/mono.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index ac84336..2f2b3ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2299,6 +2299,20 @@ dependencies = [ "syn", ] +[[package]] +name = "engine" +version = "0.1.0" +dependencies = [ + "bevy", + "chrono", + "itertools 0.14.0", + "lipsum", + "rand 0.9.2", + "serde", + "thiserror 2.0.12", + "walkdir", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -2376,6 +2390,14 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "flappy" +version = "0.1.0" +dependencies = [ + "engine", + "physics", +] + [[package]] name = "flate2" version = "1.1.2" @@ -2497,24 +2519,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "games" -version = "0.1.0" -dependencies = [ - "avian2d", - "avian3d", - "bevy", - "chrono", - "indoc", - "itertools 0.14.0", - "lipsum", - "rand 0.9.2", - "serde", - "thiserror 2.0.12", - "toml", - "walkdir", -] - [[package]] name = "gethostname" version = "0.4.3" @@ -2903,6 +2907,10 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "hum" +version = "0.1.0" + [[package]] name = "iana-time-zone" version = "0.1.63" @@ -4041,6 +4049,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "physics" +version = "0.1.0" +dependencies = [ + "avian2d", + "avian3d", + "engine", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -4857,6 +4874,17 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "tetris" +version = "0.1.0" +dependencies = [ + "bevy", + "engine", + "serde", + "thiserror 1.0.69", + "toml", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -5098,6 +5126,14 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "trees" +version = "0.1.0" +dependencies = [ + "engine", + "indoc", +] + [[package]] name = "ttf-parser" version = "0.20.0" diff --git a/Cargo.toml b/Cargo.toml index 274f470..c79a54d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,44 +1,3 @@ -[package] -name = "games" -version = "0.1.0" -edition = "2024" - -[[example]] -name = "demo_parallax2d" -path = "examples/demos/parallax2d.rs" - -[[example]] -name = "demo_parallax3d" -path = "examples/demos/parallax3d.rs" - -[features] -hide_debug = [] - -[dependencies] -itertools = "*" -thiserror = "2.0.12" -toml = "0.9.8" - -[dependencies.serde] -version = "1.0.219" -features = ["derive"] - -[dependencies.avian3d] -version = "0.4.1" - -[dependencies.avian2d] -version = "0.4.1" - -[dependencies.bevy] -version = "0.17.2" -features = ["wayland", "dynamic_linking", "track_location", "experimental_bevy_feathers", "experimental_bevy_ui_widgets"] - -[dev-dependencies] -lipsum = "*" -rand = "*" -itertools = "*" -indoc = "*" - -[build-dependencies] -walkdir = "*" -chrono = "*" +[workspace] +resolver = "3" +members = ["engine", "flappy", "hum", "physics", "tetris", "trees"] diff --git a/engine/Cargo.toml b/engine/Cargo.toml new file mode 100644 index 0000000..ed3ba16 --- /dev/null +++ b/engine/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "engine" +version = "0.1.0" +edition = "2024" + +[features] +hide_debug = [] + +[dependencies.bevy] +version = "0.17.2" +features = ["wayland", "dynamic_linking", "track_location", "experimental_bevy_feathers", "experimental_bevy_ui_widgets"] + +[dependencies.serde] +version = "1.0.219" +features = ["derive"] + +[dependencies] +itertools = "0.14.0" +thiserror = "2.0.12" + +[dev-dependencies] +lipsum = "*" +rand = "*" +itertools = "*" + +[build-dependencies] +walkdir = "*" +chrono = "*" diff --git a/examples/README.md b/engine/examples/README.md similarity index 100% rename from examples/README.md rename to engine/examples/README.md diff --git a/examples/demos/parallax2d.rs b/engine/examples/demos/parallax2d.rs similarity index 100% rename from examples/demos/parallax2d.rs rename to engine/examples/demos/parallax2d.rs diff --git a/examples/demos/parallax3d.rs b/engine/examples/demos/parallax3d.rs similarity index 100% rename from examples/demos/parallax3d.rs rename to engine/examples/demos/parallax3d.rs diff --git a/examples/feathers.rs b/engine/examples/feathers.rs similarity index 98% rename from examples/feathers.rs rename to engine/examples/feathers.rs index 13ea3c2..b89c4bc 100644 --- a/examples/feathers.rs +++ b/engine/examples/feathers.rs @@ -3,22 +3,23 @@ use bevy::{ color::palettes, feathers::{ + FeathersPlugins, controls::{ - button, checkbox, color_slider, color_swatch, radio, slider, toggle_switch, ButtonProps, ButtonVariant, ColorChannel, ColorSlider, ColorSliderProps, ColorSwatch, - SliderBaseColor, SliderProps, + SliderBaseColor, SliderProps, button, checkbox, color_slider, color_swatch, radio, + slider, toggle_switch, }, dark_theme::create_dark_theme, rounded_corners::RoundedCorners, theme::{ThemeBackgroundColor, ThemedText, UiTheme}, - tokens, FeathersPlugins, + tokens, }, input_focus::tab_navigation::TabGroup, prelude::*, ui::{Checked, InteractionDisabled}, ui_widgets::{ - checkbox_self_update, observe, slider_self_update, Activate, RadioButton, RadioGroup, - SliderPrecision, SliderStep, SliderValue, ValueChange, + Activate, RadioButton, RadioGroup, SliderPrecision, SliderStep, SliderValue, ValueChange, + checkbox_self_update, observe, slider_self_update, }, }; diff --git a/examples/game2d.rs b/engine/examples/game2d.rs similarity index 98% rename from examples/game2d.rs rename to engine/examples/game2d.rs index 40a1ae2..bb39f83 100644 --- a/examples/game2d.rs +++ b/engine/examples/game2d.rs @@ -1,4 +1,4 @@ -use games::*; +use engine::*; fn main() { App::new() diff --git a/examples/images.rs b/engine/examples/images.rs similarity index 99% rename from examples/images.rs rename to engine/examples/images.rs index 7f49914..43533cc 100644 --- a/examples/images.rs +++ b/engine/examples/images.rs @@ -1,6 +1,6 @@ use std::f32::consts::PI; -use games::*; +use engine::*; fn main() { App::new() diff --git a/examples/parallax.rs b/engine/examples/parallax.rs similarity index 99% rename from examples/parallax.rs rename to engine/examples/parallax.rs index 1f1b86d..2303c93 100644 --- a/examples/parallax.rs +++ b/engine/examples/parallax.rs @@ -1,4 +1,4 @@ -use games::*; +use engine::*; fn main() { App::new() diff --git a/examples/scroll.rs b/engine/examples/scroll.rs similarity index 100% rename from examples/scroll.rs rename to engine/examples/scroll.rs diff --git a/examples/sync_resource_to_ui.rs b/engine/examples/sync_resource_to_ui.rs similarity index 98% rename from examples/sync_resource_to_ui.rs rename to engine/examples/sync_resource_to_ui.rs index f937f2f..0c72384 100644 --- a/examples/sync_resource_to_ui.rs +++ b/engine/examples/sync_resource_to_ui.rs @@ -1,4 +1,4 @@ -use games::*; +use engine::*; fn main() { App::new() diff --git a/examples/ui.rs b/engine/examples/ui.rs similarity index 99% rename from examples/ui.rs rename to engine/examples/ui.rs index 8c6e8ff..19255a5 100644 --- a/examples/ui.rs +++ b/engine/examples/ui.rs @@ -3,7 +3,7 @@ //! This example illustrates scrolling in Bevy UI. use bevy::picking::hover::HoverMap; -use games::*; +use engine::*; use lipsum::*; use rand::*; diff --git a/examples/window.rs b/engine/examples/window.rs similarity index 98% rename from examples/window.rs rename to engine/examples/window.rs index 8c243cb..bb5d570 100644 --- a/examples/window.rs +++ b/engine/examples/window.rs @@ -1,4 +1,4 @@ -use games::*; +use engine::*; fn main() { App::new() diff --git a/src/base_game.rs b/engine/src/base_game.rs similarity index 100% rename from src/base_game.rs rename to engine/src/base_game.rs diff --git a/src/debug.rs b/engine/src/debug.rs similarity index 100% rename from src/debug.rs rename to engine/src/debug.rs diff --git a/src/lib.rs b/engine/src/lib.rs similarity index 97% rename from src/lib.rs rename to engine/src/lib.rs index 3453b11..9c472e2 100644 --- a/src/lib.rs +++ b/engine/src/lib.rs @@ -6,8 +6,6 @@ mod base_game; mod debug; mod loading; mod parallax; -pub mod physics2d; -pub mod physics3d; mod scheduling; mod ui; mod version; @@ -24,6 +22,7 @@ pub use bevy::{ }, camera::{primitives::*, visibility::*, *}, color::palettes::css::*, + feathers::controls::*, gizmos::{aabb::AabbGizmoPlugin, light::LightGizmoPlugin}, input::{ ButtonState, @@ -40,10 +39,9 @@ pub use bevy::{ render::render_resource::{Extent3d, TextureDimension, TextureFormat, TextureUsages}, sprite_render::*, time::common_conditions::*, - window::{WindowResized, WindowResolution}, - ui_widgets::{Button, *}, ui::*, - feathers::controls::*, + ui_widgets::{Button, *}, + window::{WindowResized, WindowResolution}, }; pub use itertools::Itertools; pub use serde::Deserialize; diff --git a/src/loading.rs b/engine/src/loading.rs similarity index 100% rename from src/loading.rs rename to engine/src/loading.rs diff --git a/src/parallax.rs b/engine/src/parallax.rs similarity index 100% rename from src/parallax.rs rename to engine/src/parallax.rs diff --git a/src/scheduling.rs b/engine/src/scheduling.rs similarity index 100% rename from src/scheduling.rs rename to engine/src/scheduling.rs diff --git a/src/ui.rs b/engine/src/ui.rs similarity index 100% rename from src/ui.rs rename to engine/src/ui.rs diff --git a/src/version.rs b/engine/src/version.rs similarity index 56% rename from src/version.rs rename to engine/src/version.rs index 86efe47..1345405 100644 --- a/src/version.rs +++ b/engine/src/version.rs @@ -1,2 +1,2 @@ /// Include the version of this build from an auto-generated version file -pub const VERSION: &str = include_str!("../VERSION"); +pub const VERSION: &str = include_str!("../../VERSION"); diff --git a/flappy/Cargo.toml b/flappy/Cargo.toml new file mode 100644 index 0000000..c94cd0c --- /dev/null +++ b/flappy/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "flappy" +version = "0.1.0" +edition = "2024" + +[dependencies.engine] +path = "../engine" + +[dependencies.physics] +path = "../physics" diff --git a/src/bin/flappy/main.rs b/flappy/src/main.rs similarity index 99% rename from src/bin/flappy/main.rs rename to flappy/src/main.rs index bb51743..e5e99e4 100644 --- a/src/bin/flappy/main.rs +++ b/flappy/src/main.rs @@ -4,8 +4,8 @@ use bevy::image::{ImageLoaderSettings, ImageSampler}; use bevy::platform::time::Instant; use bevy::render::view::ColorGrading; -use games::physics2d::*; -use games::*; +use engine::*; +use physics::physics2d::*; use std::hash::BuildHasher; fn main() { diff --git a/hum/Cargo.toml b/hum/Cargo.toml new file mode 100644 index 0000000..4e4ea56 --- /dev/null +++ b/hum/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "hum" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/src/bin/hum/main.rs b/hum/src/main.rs similarity index 90% rename from src/bin/hum/main.rs rename to hum/src/main.rs index 4ea5bf0..00888ca 100644 --- a/src/bin/hum/main.rs +++ b/hum/src/main.rs @@ -1,4 +1,4 @@ -use games::*; +use engine::*; fn main() { App::new() diff --git a/justfile b/justfile index 0682cc5..66bd279 100644 --- a/justfile +++ b/justfile @@ -1,5 +1,11 @@ VERSION := `git rev-parse --short HEAD` +check: + cargo check -p tetris + +play: + cargo run -p tetris + bindgen profile name: mkdir -p ./dist/{{name}} diff --git a/physics/Cargo.toml b/physics/Cargo.toml new file mode 100644 index 0000000..1059feb --- /dev/null +++ b/physics/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "physics" +version = "0.1.0" +edition = "2024" + +[dependencies.engine] +path = "../engine" + +[dependencies.avian3d] +version = "0.4.1" + +[dependencies.avian2d] +version = "0.4.1" + diff --git a/physics/src/lib.rs b/physics/src/lib.rs new file mode 100644 index 0000000..9260125 --- /dev/null +++ b/physics/src/lib.rs @@ -0,0 +1,2 @@ +pub mod physics2d; +pub mod physics3d; diff --git a/src/physics2d.rs b/physics/src/physics2d.rs similarity index 99% rename from src/physics2d.rs rename to physics/src/physics2d.rs index 92bc290..ac84613 100644 --- a/src/physics2d.rs +++ b/physics/src/physics2d.rs @@ -1,4 +1,5 @@ use super::*; + pub use avian2d::prelude::*; /// 2D Physics systems, resources, events, etc. diff --git a/src/physics3d.rs b/physics/src/physics3d.rs similarity index 100% rename from src/physics3d.rs rename to physics/src/physics3d.rs diff --git a/src/bin/README.md b/src/bin/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/src/bin/tetris/blocks.rs b/src/bin/tetris/blocks.rs deleted file mode 100644 index 9eaa88f..0000000 --- a/src/bin/tetris/blocks.rs +++ /dev/null @@ -1,53 +0,0 @@ -use super::*; - -/// Create tetris game with camera that renders to subset of viewport -/// -/// Focus on a single piece and making it really tight mechanically -/// A single piece with movement, rotation, jump-to-end, line clearing, etc. -/// -/// Once done, make pieces a data input so we can add arbitrary metadata to them -pub struct BlocksPlugin; - -impl Plugin for BlocksPlugin { - fn build(&self, app: &mut App) { - app.add_systems(Startup, init_blocks); - } -} - -/// Shape asset -/// Stores shape data in an asset file, likely toml -#[derive(Asset, TypePath, Debug, Deserialize)] -struct ShapeAsset { - layout: Vec> -} - -#[derive(Default)] -struct ShapeAssetLoader; - -impl AssetLoader for ShapeAssetLoader { - type Asset = ShapeAsset; - type Settings = (); - type Error = (); - async fn load( - &self, - reader: &mut dyn Reader, - _settings: &(), - _load_context: &mut LoadContext<'_>, - ) -> Result { - let mut bytes = Vec::new(); - reader.read_to_end(&mut bytes).await.unwrap_or(()); - let shape_asset = toml::from_slice::(bytes.into()).unwrap_or(()); - Ok(shape_asset) - } - - fn extension(&self) -> &[str] { - &["shape.toml"] - } -} - -/// Initialize camera and block game area -fn init_blocks( - mut commands: Commands, -) { - commands.spawn((Camera2d, Camera::default())); -} diff --git a/src/bin/tetris/main.rs b/src/bin/tetris/main.rs deleted file mode 100644 index 1ad97df..0000000 --- a/src/bin/tetris/main.rs +++ /dev/null @@ -1,16 +0,0 @@ -mod blocks; -mod debug; -mod fighter; - -use games::*; - -use blocks::*; -use debug::*; -use fighter::*; - -fn main() { - App::new() - .add_plugins((DefaultPlugins, BlocksPlugin, FighterPlugin)) - .run(); -} - diff --git a/tetris/Cargo.toml b/tetris/Cargo.toml new file mode 100644 index 0000000..2b0d1f3 --- /dev/null +++ b/tetris/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "tetris" +version = "0.1.0" +edition = "2024" + +[dependencies.serde] +version = "1.0.219" +features = ["derive"] + +[dependencies.engine] +path = "../engine" + +[dependencies] +toml = "0.9.8" +thiserror = "*" + +[dependencies.bevy] +version = "0.17.2" +features = ["wayland", "dynamic_linking", "track_location", "experimental_bevy_feathers", "experimental_bevy_ui_widgets"] diff --git a/tetris/assets/t.shape.toml b/tetris/assets/t.shape.toml new file mode 100644 index 0000000..96a8e66 --- /dev/null +++ b/tetris/assets/t.shape.toml @@ -0,0 +1,4 @@ +layout = [ + [0,1,0], + [1,1,1], +] diff --git a/tetris/src/blocks.rs b/tetris/src/blocks.rs new file mode 100644 index 0000000..59ab989 --- /dev/null +++ b/tetris/src/blocks.rs @@ -0,0 +1,90 @@ +use super::*; + +/// Create tetris game with camera that renders to subset of viewport +/// +/// Focus on a single piece and making it really tight mechanically +/// A single piece with movement, rotation, jump-to-end, line clearing, etc. +/// +/// Once done, make pieces a data input so we can add arbitrary metadata to them +pub struct BlocksPlugin; + +impl Plugin for BlocksPlugin { + fn build(&self, app: &mut App) { + app.init_asset::() + .init_asset_loader::() + .add_systems(OnEnter(LoadState::Loading), load_assets) + .add_systems(OnEnter(GameState::Setup), (setup_camera, setup_blocks)) + .add_observer(add_shape); + } +} + +/// Shape asset +/// Stores shape data in an asset file, likely toml +#[derive(Asset, TypePath, Debug, Deserialize)] +struct ShapeAsset { + layout: Vec>, +} + +impl ShapeAsset { + fn into_bundle(&self) -> impl Bundle { + () + } +} + +#[derive(Default)] +struct ShapeAssetLoader; + +#[derive(Debug, Error)] +enum ShapeAssetError { + #[error("Failed to read file {0}")] + Io(#[from] std::io::Error), + #[error("Failed to parse file {0}")] + Parse(#[from] toml::de::Error), +} + +impl AssetLoader for ShapeAssetLoader { + type Asset = ShapeAsset; + type Settings = (); + type Error = ShapeAssetError; + async fn load( + &self, + reader: &mut dyn Reader, + _settings: &(), + _load_context: &mut LoadContext<'_>, + ) -> Result { + let mut bytes = Vec::new(); + reader.read_to_end(&mut bytes).await?; + let shape_asset = toml::from_slice::(bytes.as_slice())?; + Ok(shape_asset) + } + + fn extensions(&self) -> &[&str] { + &["shape.toml"] + } +} + +/// Initialize camera and block game area +fn load_assets(server: Res, mut all_assets: ResMut) { + all_assets.handles.push(server.load::("t.shape.toml").untyped()); +} + +fn setup_camera(mut commands: Commands) { + commands.spawn((Camera2d, Camera::default())); +} + +fn setup_blocks(mut commands: Commands) { + error!("Setup blocks"); + error!("Once all steps are setup, move on to Run"); +} + +/// Event handler for transforming a handle component into a thing +fn add_shape( + event: On>, + query: Query<&AssetComponent>, + mut commands: Commands, + shapes: Res>, +) { + let asset_component = query.get(event.entity).unwrap(); + let shape = shapes.get(asset_component.handle.id()).unwrap(); + commands.entity(event.entity).insert(shape.into_bundle()); +} diff --git a/src/bin/tetris/debug.rs b/tetris/src/debug.rs similarity index 100% rename from src/bin/tetris/debug.rs rename to tetris/src/debug.rs diff --git a/src/bin/tetris/fighter.rs b/tetris/src/fighter.rs similarity index 100% rename from src/bin/tetris/fighter.rs rename to tetris/src/fighter.rs diff --git a/tetris/src/main.rs b/tetris/src/main.rs new file mode 100644 index 0000000..e5c97db --- /dev/null +++ b/tetris/src/main.rs @@ -0,0 +1,69 @@ +mod blocks; +mod debug; +mod fighter; + +use engine::*; +use serde::Deserialize; +use thiserror::Error; + +use blocks::*; +use debug::*; +use fighter::*; + +fn main() { + App::new() + .add_plugins((DefaultPlugins, BlocksPlugin, FighterPlugin)) + .init_state::() + .init_resource::() + .add_systems(Update, load.run_if(in_state(LoadState::Loading))) + .run(); +} + +#[derive(Default, Resource)] +struct AllAssets { + handles: Vec, +} + +/// Reports if the game is loading assets +#[derive(States, Default, Clone, Eq, Debug, PartialEq, Hash)] +enum LoadState { + #[default] + Loading, + Loaded, +} + +/// Tracks if the game is in debug mode +#[derive(States, Default, Clone, Eq, Debug, PartialEq, Hash)] +enum DebugState { + #[default] + Off, + On, +} + +/// Tracks what state the main game loop is in +#[derive(States, Default, Clone, Eq, Debug, PartialEq, Hash)] +enum GameState { + #[default] + Setup, + Run, +} + +fn load(mut next: ResMut>, server: Res, assets: Res) { + for asset in assets.handles.iter() { + let state = server.get_load_state(asset.id()); + println!("{:?}", state); + } + next.set(GameState::Setup); +} + +/// A wrapper around a handle for assigning an arbitrary Handle to an entity +#[derive(Debug, Component)] +struct AssetComponent { + handle: Handle, +} + +impl AssetComponent { + fn new(handle: Handle) -> Self { + Self { handle } + } +} diff --git a/trees/Cargo.toml b/trees/Cargo.toml new file mode 100644 index 0000000..f2485a8 --- /dev/null +++ b/trees/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "trees" +version = "0.1.0" +edition = "2024" + +[dependencies.engine] +path = "../engine" + +[dev-dependencies] +indoc = "*" diff --git a/src/bin/trees/README.md b/trees/src/README.md similarity index 100% rename from src/bin/trees/README.md rename to trees/src/README.md diff --git a/src/bin/trees/debug.rs b/trees/src/debug.rs similarity index 100% rename from src/bin/trees/debug.rs rename to trees/src/debug.rs diff --git a/src/bin/trees/main.rs b/trees/src/main.rs similarity index 99% rename from src/bin/trees/main.rs rename to trees/src/main.rs index ac183da..ba6948c 100644 --- a/src/bin/trees/main.rs +++ b/trees/src/main.rs @@ -8,7 +8,7 @@ mod mono; use bevy::{picking::hover::HoverMap, platform::hash::RandomState}; use debug::*; -use games::*; +use engine::*; use mono::*; use std::hash::BuildHasher; diff --git a/src/bin/trees/mono.rs b/trees/src/mono.rs similarity index 100% rename from src/bin/trees/mono.rs rename to trees/src/mono.rs