From 3cddecf592e8311ed82d7bac1a6a88a4ee540a4e Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Mon, 30 Mar 2026 20:43:46 +0300 Subject: [PATCH] feat: added clap for level parsing - Camera sets up as a child of player entity --- Cargo.lock | 135 +++++++++++++++++++++++++++++++++-- Cargo.toml | 1 + assets/levels/level_alt.toml | 5 +- src/layout/systems.rs | 5 +- src/lib.rs | 12 +++- src/main.rs | 6 +- src/player/mod.rs | 5 +- 7 files changed, 156 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8cd5c91..ae1bfa5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -177,6 +177,56 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + [[package]] name = "anyhow" version = "1.0.102" @@ -1899,6 +1949,46 @@ dependencies = [ "libloading", ] +[[package]] +name = "clap" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + [[package]] name = "codespan-reporting" version = "0.12.0" @@ -1910,6 +2000,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + [[package]] name = "combine" version = "4.6.7" @@ -2428,6 +2524,7 @@ dependencies = [ "bevy_common_assets", "bevy_input", "bevy_rapier2d", + "clap", "leafwing-input-manager", "serde", "toml 1.0.3+spec-1.1.0", @@ -2980,6 +3077,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.5.2" @@ -3129,6 +3232,12 @@ dependencies = [ "rustversion", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "itertools" version = "0.13.0" @@ -4010,6 +4119,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "orbclient" version = "0.3.50" @@ -4290,9 +4405,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -4889,6 +5004,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "svg_fmt" version = "0.4.5" @@ -4908,9 +5029,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.115" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -5293,6 +5414,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.20.0" diff --git a/Cargo.toml b/Cargo.toml index 8046927..11662b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ bevy = { version = "0.18.0", features = ["bevy_remote", "debug", "experimental_b bevy_common_assets = { version = "0.15.0", features = ["toml"] } bevy_input = { version = "0.18.0", features = ["serde", "serialize"] } bevy_rapier2d = { version = "0.33.0", features = ["rapier-debug-render"] } +clap = { version = "4.6.0", features = ["derive"] } leafwing-input-manager = "0.20.0" serde = { version = "1.0.228", features = ["derive"] } toml = "1.0.3" diff --git a/assets/levels/level_alt.toml b/assets/levels/level_alt.toml index b1aa68a..35d45c1 100644 --- a/assets/levels/level_alt.toml +++ b/assets/levels/level_alt.toml @@ -6,12 +6,15 @@ floors = [ { x = 0, y = 0, w = 16 }, { x = 0, y = 4, w = 16 }, { x = 0, y = 8, w = 16 }, + { x = 0, y = 12, w = 16 }, ] walls = [ { x = 0, y = 1, h = 3 }, { x = 0, y = 5, h = 3 }, + { x = 0, y = 9, h = 3 }, { x = 15, y = 1, h = 3 }, { x = 15, y = 5, h = 3 }, + { x = 15, y = 9, h = 3 }, ] wall_connectors = [ { x = 4, y = 3 }, @@ -29,7 +32,7 @@ doors = [ { x = 11, y = 5, facing = "left" }, ] stairs = [ - { x = 8, y = 1 }, + { x = 8, y = 1, floors = 3 }, ] containers = [ { x = 2, y = 1 }, diff --git a/src/layout/systems.rs b/src/layout/systems.rs index 6caede2..ae27b14 100644 --- a/src/layout/systems.rs +++ b/src/layout/systems.rs @@ -6,7 +6,7 @@ use bevy::{ use bevy_rapier2d::prelude::*; use crate::{ - player::Player, + StartupArgs, player::Player }; use super::*; @@ -86,7 +86,8 @@ pub fn lock_door( pub fn setup_world( mut commands: Commands, asset_server: Res, + startup_args: Res, ) { - let level_handle = asset_server.load("levels/level.toml"); + let level_handle = asset_server.load(startup_args.level.clone()); commands.insert_resource(LevelAssetHandle(level_handle)); } diff --git a/src/lib.rs b/src/lib.rs index 8263978..3ee81a7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,6 +7,7 @@ use bevy_rapier2d::{ prelude::*, rapier::prelude::IntegrationParameters, }; +use clap::Parser; pub mod input; pub mod inventory; @@ -37,7 +38,15 @@ pub enum LoadingState { Ready, } -fn camera_bundle() -> impl Bundle { +#[derive(Parser, Resource, Clone, PartialEq, Eq, Hash, Debug, Reflect, Default)] +#[reflect(Resource, Clone, PartialEq, Hash, Debug, Default)] +pub struct StartupArgs { + #[arg(long, short, default_value = "levels/level.toml")] + /// Level to load (relative to assets folder) + level: String, +} + +pub fn camera_bundle() -> impl Bundle { ( Camera2d, Camera { @@ -67,7 +76,6 @@ pub const fn meters(value: f32) -> f32 { } fn setup_global(mut commands: Commands) { - commands.spawn(camera_bundle()); commands.spawn(ui::UiRoot::new()); } diff --git a/src/main.rs b/src/main.rs index e267a13..f3b2981 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,12 +6,16 @@ use bevy::{ }, }; -use expedition_demo::ExpeditionPlugin; +use clap::Parser; +use expedition_demo::{ExpeditionPlugin, StartupArgs}; fn main() { + let startup_args = StartupArgs::parse(); + App::new() .add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest())) .add_plugins(ExpeditionPlugin) + .insert_resource(startup_args) .add_plugins(RemotePlugin::default()) .add_plugins(RemoteHttpPlugin::default()) .run(); diff --git a/src/player/mod.rs b/src/player/mod.rs index 911963a..1e94631 100644 --- a/src/player/mod.rs +++ b/src/player/mod.rs @@ -2,9 +2,7 @@ use bevy::prelude::*; use bevy_rapier2d::prelude::*; use crate::{ - meters, - input::InputAction as Action, - inventory::Inventory, + camera_bundle, input::InputAction as Action, inventory::Inventory, meters }; pub mod systems; @@ -40,6 +38,7 @@ pub fn player_bundle(asset_server: &Res, position: Vec2) -> impl Bu Inventory::new(UVec2::new(6, 2)), Inventory::new(UVec2::new(5, 3)), Inventory::new(UVec2::new(4, 4)), + camera_bundle(), ], ) }