From 7996d632f72424ff84045946667585812ebe5d05 Mon Sep 17 00:00:00 2001 From: extrawurst <776816+extrawurst@users.noreply.github.com> Date: Sun, 29 Jun 2025 12:45:25 +0200 Subject: [PATCH] Split crate into shared logic library and binary crate (#52) (#53) --- .cargo/config.toml | 2 + .github/workflows/ci_debug.yml | 2 +- Cargo.lock | 48 +++ Cargo.toml | 47 ++- crates/client/Cargo.toml | 31 ++ build.rs => crates/client/build.rs | 0 {src => crates/client/src}/debug.rs | 0 {src => crates/client/src}/main.rs | 49 +--- crates/server/Cargo.toml | 27 ++ crates/server/src/main.rs | 274 ++++++++++++++++++ crates/shared/Cargo.toml | 30 ++ {src => crates/shared/src}/abilities/arrow.rs | 0 .../shared/src}/abilities/curver.rs | 0 {src => crates/shared/src}/abilities/gun.rs | 0 .../shared/src}/abilities/healing.rs | 0 .../shared/src}/abilities/missile.rs | 0 {src => crates/shared/src}/abilities/mod.rs | 0 .../shared/src}/abilities/thrown.rs | 0 {src => crates/shared/src}/ai/mod.rs | 0 {src => crates/shared/src}/aim/marker.rs | 0 {src => crates/shared/src}/aim/mod.rs | 0 {src => crates/shared/src}/aim/target_ui.rs | 0 {src => crates/shared/src}/animation.rs | 0 .../shared/src}/backpack/backpack_ui.rs | 0 {src => crates/shared/src}/backpack/mod.rs | 0 .../shared/src}/backpack/ui_head_state.rs | 0 {src => crates/shared/src}/camera.rs | 0 {src => crates/shared/src}/cash.rs | 0 {src => crates/shared/src}/cash_heal.rs | 0 {src => crates/shared/src}/character.rs | 0 .../shared/src}/control/controller_common.rs | 0 .../shared/src}/control/controller_flying.rs | 0 .../shared/src}/control/controller_running.rs | 0 .../shared/src}/control/controls.rs | 0 {src => crates/shared/src}/control/mod.rs | 0 {src => crates/shared/src}/cutscene.rs | 0 {src => crates/shared/src}/gates.rs | 0 {src => crates/shared/src}/head.rs | 0 {src => crates/shared/src}/head_drop.rs | 0 {src => crates/shared/src}/heads/heads_ui.rs | 0 {src => crates/shared/src}/heads/mod.rs | 0 {src => crates/shared/src}/heads_database.rs | 0 {src => crates/shared/src}/heal_effect.rs | 0 {src => crates/shared/src}/hitpoints.rs | 0 {src => crates/shared/src}/keys.rs | 0 crates/shared/src/lib.rs | 51 ++++ {src => crates/shared/src}/loading_assets.rs | 0 {src => crates/shared/src}/loading_map.rs | 0 {src => crates/shared/src}/movables.rs | 0 {src => crates/shared/src}/npc.rs | 0 {src => crates/shared/src}/physics_layers.rs | 0 {src => crates/shared/src}/platforms.rs | 0 {src => crates/shared/src}/player.rs | 0 {src => crates/shared/src}/sounds.rs | 4 +- {src => crates/shared/src}/tb_entities.rs | 2 +- .../shared/src}/utils/auto_rotate.rs | 0 .../shared/src}/utils/billboards.rs | 0 .../shared/src}/utils/explosions.rs | 0 {src => crates/shared/src}/utils/mod.rs | 0 {src => crates/shared/src}/utils/observers.rs | 0 .../shared/src}/utils/sprite_3d_animation.rs | 0 .../shared/src}/utils/squish_animation.rs | 0 {src => crates/shared/src}/utils/trail.rs | 0 {src => crates/shared/src}/water.rs | 0 justfile | 12 +- 65 files changed, 497 insertions(+), 82 deletions(-) create mode 100644 .cargo/config.toml create mode 100644 crates/client/Cargo.toml rename build.rs => crates/client/build.rs (100%) rename {src => crates/client/src}/debug.rs (100%) rename {src => crates/client/src}/main.rs (91%) create mode 100644 crates/server/Cargo.toml create mode 100644 crates/server/src/main.rs create mode 100644 crates/shared/Cargo.toml rename {src => crates/shared/src}/abilities/arrow.rs (100%) rename {src => crates/shared/src}/abilities/curver.rs (100%) rename {src => crates/shared/src}/abilities/gun.rs (100%) rename {src => crates/shared/src}/abilities/healing.rs (100%) rename {src => crates/shared/src}/abilities/missile.rs (100%) rename {src => crates/shared/src}/abilities/mod.rs (100%) rename {src => crates/shared/src}/abilities/thrown.rs (100%) rename {src => crates/shared/src}/ai/mod.rs (100%) rename {src => crates/shared/src}/aim/marker.rs (100%) rename {src => crates/shared/src}/aim/mod.rs (100%) rename {src => crates/shared/src}/aim/target_ui.rs (100%) rename {src => crates/shared/src}/animation.rs (100%) rename {src => crates/shared/src}/backpack/backpack_ui.rs (100%) rename {src => crates/shared/src}/backpack/mod.rs (100%) rename {src => crates/shared/src}/backpack/ui_head_state.rs (100%) rename {src => crates/shared/src}/camera.rs (100%) rename {src => crates/shared/src}/cash.rs (100%) rename {src => crates/shared/src}/cash_heal.rs (100%) rename {src => crates/shared/src}/character.rs (100%) rename {src => crates/shared/src}/control/controller_common.rs (100%) rename {src => crates/shared/src}/control/controller_flying.rs (100%) rename {src => crates/shared/src}/control/controller_running.rs (100%) rename {src => crates/shared/src}/control/controls.rs (100%) rename {src => crates/shared/src}/control/mod.rs (100%) rename {src => crates/shared/src}/cutscene.rs (100%) rename {src => crates/shared/src}/gates.rs (100%) rename {src => crates/shared/src}/head.rs (100%) rename {src => crates/shared/src}/head_drop.rs (100%) rename {src => crates/shared/src}/heads/heads_ui.rs (100%) rename {src => crates/shared/src}/heads/mod.rs (100%) rename {src => crates/shared/src}/heads_database.rs (100%) rename {src => crates/shared/src}/heal_effect.rs (100%) rename {src => crates/shared/src}/hitpoints.rs (100%) rename {src => crates/shared/src}/keys.rs (100%) create mode 100644 crates/shared/src/lib.rs rename {src => crates/shared/src}/loading_assets.rs (100%) rename {src => crates/shared/src}/loading_map.rs (100%) rename {src => crates/shared/src}/movables.rs (100%) rename {src => crates/shared/src}/npc.rs (100%) rename {src => crates/shared/src}/physics_layers.rs (100%) rename {src => crates/shared/src}/platforms.rs (100%) rename {src => crates/shared/src}/player.rs (100%) rename {src => crates/shared/src}/sounds.rs (95%) rename {src => crates/shared/src}/tb_entities.rs (99%) rename {src => crates/shared/src}/utils/auto_rotate.rs (100%) rename {src => crates/shared/src}/utils/billboards.rs (100%) rename {src => crates/shared/src}/utils/explosions.rs (100%) rename {src => crates/shared/src}/utils/mod.rs (100%) rename {src => crates/shared/src}/utils/observers.rs (100%) rename {src => crates/shared/src}/utils/sprite_3d_animation.rs (100%) rename {src => crates/shared/src}/utils/squish_animation.rs (100%) rename {src => crates/shared/src}/utils/trail.rs (100%) rename {src => crates/shared/src}/water.rs (100%) diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..550d719 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[env] +BEVY_ASSET_ROOT = { value = "", relative = true } diff --git a/.github/workflows/ci_debug.yml b/.github/workflows/ci_debug.yml index b45bf73..21bb7b5 100644 --- a/.github/workflows/ci_debug.yml +++ b/.github/workflows/ci_debug.yml @@ -21,7 +21,7 @@ jobs: packages: libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev version: 1.0 - - name: Build + - name: Build client run: | cargo build --locked --target=x86_64-unknown-linux-gnu diff --git a/Cargo.lock b/Cargo.lock index 7ecba34..40bb6d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3146,6 +3146,7 @@ dependencies = [ "rand 0.8.5", "ron", "serde", + "shared", "steamworks", "vergen-gitcl", ] @@ -5120,6 +5121,30 @@ dependencies = [ "serde", ] +[[package]] +name = "server" +version = "0.1.0" +dependencies = [ + "avian3d", + "bevy", + "bevy-inspector-egui", + "bevy-steamworks", + "bevy-ui-gradients", + "bevy_asset_loader", + "bevy_ballistic", + "bevy_common_assets", + "bevy_debug_log", + "bevy_sprite3d", + "bevy_trenchbroom", + "happy_feet", + "nil 0.14.0", + "rand 0.8.5", + "ron", + "serde", + "shared", + "steamworks", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -5129,6 +5154,29 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shared" +version = "0.1.0" +dependencies = [ + "avian3d", + "bevy", + "bevy-inspector-egui", + "bevy-steamworks", + "bevy-ui-gradients", + "bevy_asset_loader", + "bevy_ballistic", + "bevy_common_assets", + "bevy_debug_log", + "bevy_sprite3d", + "bevy_trenchbroom", + "happy_feet", + "nil 0.14.0", + "rand 0.8.5", + "ron", + "serde", + "steamworks", +] + [[package]] name = "shlex" version = "1.3.0" diff --git a/Cargo.toml b/Cargo.toml index c014ca7..5389598 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,9 @@ -[package] -name = "hedz_reloaded" -version = "0.1.0" -edition = "2024" -build = "build.rs" -[profile.dev.package."*"] -opt-level = 3 +[workspace] +resolver = "3" +members = ["crates/*"] -[features] -dbg = ["avian3d/debug-plugin", "dep:bevy-inspector-egui"] - -[dependencies] +[workspace.dependencies] avian3d = { version = "0.3", default-features = false, features = [ "3d", "f32", @@ -21,28 +14,24 @@ avian3d = { version = "0.3", default-features = false, features = [ "parallel", ] } bevy = { version = "0.16.0", features = ["track_location"] } -bevy_trenchbroom = { version = "0.8.1", features = ["avian"] } -nil = "0.14.0" -bevy_asset_loader = "0.23.0-rc.3" -bevy_sprite3d = "5.0.0" -rand = "=0.8.5" -bevy-inspector-egui = { version = "0.31", optional = true } +bevy-inspector-egui = { version = "0.31" } bevy-steamworks = "0.13.0" -steamworks = "0.11" -bevy_ballistic = "0.4.0" bevy-ui-gradients = "0.4.0" -bevy_debug_log = "0.6.0" +bevy_asset_loader = "0.23.0-rc.3" +bevy_ballistic = "0.4.0" bevy_common_assets = { version = "0.13.0", features = ["ron"] } -serde = { version = "1.0.219", features = ["derive"] } -ron = "0.8" +bevy_debug_log = "0.6.0" +bevy_sprite3d = "5.0.0" +bevy_trenchbroom = { version = "0.8.1", features = ["avian"] } happy_feet = { git = "https://github.com/rustunit/happy_feet.git", rev = "ecfecc6243862bc2bc64dcadfd0efd21c766ab5b" } - -[build-dependencies] -vergen-gitcl = "1.0" - -[lints.clippy] -too_many_arguments = "allow" -type_complexity = "allow" +nil = "0.14.0" +rand = "=0.8.5" +ron = "0.8" +serde = { version = "1.0.219", features = ["derive"] } +shared = { path = "crates/shared" } +steamworks = "0.11" +[profile.dev.package."*"] +opt-level = 3 [patch.crates-io] bevy-steamworks = { git = "https://github.com/HouraiTeahouse/bevy_steamworks.git", rev = "1933e5d" } diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml new file mode 100644 index 0000000..7246067 --- /dev/null +++ b/crates/client/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "hedz_reloaded" +version = "0.1.0" +edition = "2024" +build = "build.rs" + +[features] +dbg = ["avian3d/debug-plugin", "dep:bevy-inspector-egui", "shared/dbg"] + +[dependencies] +avian3d = { workspace = true } +bevy = { workspace = true } +bevy-inspector-egui = { workspace = true, optional = true } +bevy-steamworks = { workspace = true } +bevy-ui-gradients = { workspace = true } +bevy_asset_loader = { workspace = true } +bevy_ballistic = { workspace = true } +bevy_common_assets = { workspace = true } +bevy_debug_log = { workspace = true } +bevy_sprite3d = { workspace = true } +bevy_trenchbroom = { workspace = true } +happy_feet = { workspace = true } +nil = { workspace = true } +rand = { workspace = true } +ron = { workspace = true } +serde = { workspace = true } +shared = { workspace = true } +steamworks = { workspace = true } + +[build-dependencies] +vergen-gitcl = "1.0" diff --git a/build.rs b/crates/client/build.rs similarity index 100% rename from build.rs rename to crates/client/build.rs diff --git a/src/debug.rs b/crates/client/src/debug.rs similarity index 100% rename from src/debug.rs rename to crates/client/src/debug.rs diff --git a/src/main.rs b/crates/client/src/main.rs similarity index 91% rename from src/main.rs rename to crates/client/src/main.rs index 4a59730..508bfda 100644 --- a/src/main.rs +++ b/crates/client/src/main.rs @@ -1,34 +1,4 @@ -mod abilities; -mod ai; -mod aim; -mod animation; -mod backpack; -mod camera; -mod cash; -mod cash_heal; -mod character; -mod control; -mod cutscene; mod debug; -mod gates; -mod head; -mod head_drop; -mod heads; -mod heads_database; -mod heal_effect; -mod hitpoints; -mod keys; -mod loading_assets; -mod loading_map; -mod movables; -mod npc; -mod physics_layers; -mod platforms; -mod player; -mod sounds; -mod tb_entities; -mod utils; -mod water; use crate::utils::{auto_rotate, explosions}; use avian3d::prelude::*; @@ -46,27 +16,10 @@ use bevy_ui_gradients::UiGradientsPlugin; use camera::MainCamera; use heads_database::HeadDatabaseAsset; use loading_assets::AudioAssets; +use shared::*; use std::io::{Read, Write}; use utils::{billboards, sprite_3d_animation, squish_animation, trail}; -#[derive(Resource, Reflect, Debug)] -#[reflect(Resource)] -struct DebugVisuals { - pub unlit: bool, - pub tonemapping: Tonemapping, - pub exposure: f32, - pub shadows: bool, - pub cam_follow: bool, -} - -#[derive(States, Default, Clone, Eq, PartialEq, Debug, Hash)] -enum GameState { - #[default] - AssetLoading, - MapLoading, - Playing, -} - fn main() { let mut app = App::new(); diff --git a/crates/server/Cargo.toml b/crates/server/Cargo.toml new file mode 100644 index 0000000..005f124 --- /dev/null +++ b/crates/server/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "server" +version = "0.1.0" +edition = "2024" + +[features] +dbg = ["avian3d/debug-plugin", "dep:bevy-inspector-egui", "shared/dbg"] + +[dependencies] +avian3d = { workspace = true } +bevy = { workspace = true } +bevy-inspector-egui = { workspace = true, optional = true } +bevy-steamworks = { workspace = true } +bevy-ui-gradients = { workspace = true } +bevy_asset_loader = { workspace = true } +bevy_ballistic = { workspace = true } +bevy_common_assets = { workspace = true } +bevy_debug_log = { workspace = true } +bevy_sprite3d = { workspace = true } +bevy_trenchbroom = { workspace = true } +happy_feet = { workspace = true } +nil = { workspace = true } +rand = { workspace = true } +ron = { workspace = true } +serde = { workspace = true } +shared = { workspace = true } +steamworks = { workspace = true } diff --git a/crates/server/src/main.rs b/crates/server/src/main.rs new file mode 100644 index 0000000..e235a18 --- /dev/null +++ b/crates/server/src/main.rs @@ -0,0 +1,274 @@ +use crate::utils::{auto_rotate, explosions}; +use avian3d::prelude::*; +use bevy::{ + audio::{PlaybackMode, Volume}, + core_pipeline::tonemapping::Tonemapping, + prelude::*, + render::view::ColorGrading, +}; +use bevy_common_assets::ron::RonAssetPlugin; +use bevy_sprite3d::Sprite3dPlugin; +use bevy_steamworks::{Client, FriendFlags, SteamworksEvent, SteamworksPlugin}; +use bevy_trenchbroom::prelude::*; +use bevy_ui_gradients::UiGradientsPlugin; +use camera::MainCamera; +use heads_database::HeadDatabaseAsset; +use loading_assets::AudioAssets; +use shared::*; +use std::io::{Read, Write}; +use utils::{billboards, sprite_3d_animation, squish_animation, trail}; + +fn main() { + let mut app = App::new(); + + app.register_type::() + .register_type::(); + app.insert_resource(DebugVisuals { + unlit: false, + tonemapping: Tonemapping::None, + exposure: 1., + shadows: true, + cam_follow: true, + }); + + app.add_plugins( + DefaultPlugins + .set(WindowPlugin { + primary_window: Some(Window { + title: "HEDZ Reloaded".into(), + // resolution: (1024., 768.).into(), + ..default() + }), + ..default() + }) + .set(bevy::log::LogPlugin { + filter: "info".into(), + level: bevy::log::Level::INFO, + // provide custom log layer to receive logging events + custom_layer: bevy_debug_log::log_capture_layer, + }), + ); + + let app_id = 1603000; + // should only be done in production builds + #[cfg(not(debug_assertions))] + if steamworks::restart_app_if_necessary(app_id.into()) { + info!("Restarting app via steam"); + return; + } + + match SteamworksPlugin::init_app(app_id) { + Ok(plugin) => { + app.add_plugins(plugin); + } + Err(e) => { + warn!("steam init error: {e:?}"); + } + }; + + app.add_plugins( + bevy_debug_log::LogViewerPlugin::default() + .auto_open_threshold(bevy::log::tracing::level_filters::LevelFilter::OFF), + ); + app.add_plugins(PhysicsPlugins::default()); + app.add_plugins(Sprite3dPlugin); + app.add_plugins(TrenchBroomPlugins( + TrenchBroomConfig::new("hedz").icon(None), + )); + app.add_plugins(UiGradientsPlugin); + app.add_plugins(RonAssetPlugin::::new(&["headsdb.ron"])); + + #[cfg(feature = "dbg")] + { + app.add_plugins(bevy_inspector_egui::bevy_egui::EguiPlugin { + enable_multipass_for_primary_context: true, + }); + app.add_plugins(bevy_inspector_egui::quick::WorldInspectorPlugin::new()); + app.add_plugins(PhysicsDebugPlugin::default()); + + // app.add_plugins(bevy::pbr::wireframe::WireframePlugin) + // .insert_resource(bevy::pbr::wireframe::WireframeConfig { + // global: true, + // default_color: bevy::color::palettes::css::WHITE.into(), + // }); + } + + app.add_plugins(ai::plugin); + app.add_plugins(animation::plugin); + app.add_plugins(character::plugin); + app.add_plugins(cash::plugin); + app.add_plugins(player::plugin); + app.add_plugins(gates::plugin); + app.add_plugins(platforms::plugin); + app.add_plugins(movables::plugin); + app.add_plugins(billboards::plugin); + app.add_plugins(aim::plugin); + app.add_plugins(npc::plugin); + app.add_plugins(keys::plugin); + app.add_plugins(squish_animation::plugin); + app.add_plugins(cutscene::plugin); + app.add_plugins(control::plugin); + app.add_plugins(sounds::plugin); + app.add_plugins(camera::plugin); + app.add_plugins(backpack::plugin); + app.add_plugins(loading_assets::LoadingPlugin); + app.add_plugins(loading_map::plugin); + app.add_plugins(sprite_3d_animation::plugin); + app.add_plugins(abilities::plugin); + app.add_plugins(heads::plugin); + app.add_plugins(hitpoints::plugin); + app.add_plugins(cash_heal::plugin); + app.add_plugins(utils::observers::plugin); + app.add_plugins(water::plugin); + app.add_plugins(head_drop::plugin); + app.add_plugins(trail::plugin); + app.add_plugins(auto_rotate::plugin); + app.add_plugins(heal_effect::plugin); + app.add_plugins(tb_entities::plugin); + app.add_plugins(explosions::plugin); + + app.init_state::(); + + app.insert_resource(AmbientLight { + color: Color::WHITE, + brightness: 400., + ..Default::default() + }); + app.insert_resource(ClearColor(Color::BLACK)); + //TODO: let user control this + app.insert_resource(GlobalVolume::new(Volume::Linear(0.4))); + + app.add_systems( + Startup, + ( + write_trenchbroom_config, + (steam_system, steam_events) + .chain() + .run_if(resource_exists::), + ), + ); + app.add_systems(OnEnter(GameState::Playing), music); + app.add_systems(Update, (set_materials_unlit, set_tonemapping, set_shadows)); + + app.run(); +} + +fn steam_events(mut events: EventReader) { + for e in events.read() { + info!("steam ev: {:?}", e); + } +} + +fn steam_system(steam_client: Res) { + steam_client.matchmaking().request_lobby_list(|list| { + let Ok(list) = list else { return }; + + info!("lobby list: [{}]", list.len()); + for (i, l) in list.iter().enumerate() { + info!("lobby [{i}]: {:?}", l); + } + }); + + steam_client + .matchmaking() + .create_lobby( + steamworks::LobbyType::FriendsOnly, + 4, + |result| match result { + Ok(lobby_id) => { + info!("Created lobby with ID: {:?}", lobby_id); + } + Err(e) => error!("Failed to create lobby: {}", e), + }, + ); + + for friend in steam_client.friends().get_friends(FriendFlags::IMMEDIATE) { + info!( + "Steam Friend: {:?} - {}({:?})", + friend.id(), + friend.name(), + friend.state() + ); + } + + steam_client + .remote_storage() + .set_cloud_enabled_for_app(true); + let f = steam_client.remote_storage().file("hedz_data.dat"); + if f.exists() { + let mut buf = String::new(); + if let Err(e) = f.read().read_to_string(&mut buf) { + error!("File read error: {}", e); + } else { + info!("File content: {}", buf); + } + } else { + info!("File does not exist"); + + if let Err(e) = f.write().write_all(String::from("hello world").as_bytes()) { + error!("steam cloud error: {}", e); + } else { + info!("steam cloud saved"); + } + } +} + +fn music(assets: Res, mut commands: Commands) { + commands.spawn(( + Name::new("sfx-music"), + AudioPlayer::new(assets.music.clone()), + PlaybackSettings { + mode: PlaybackMode::Loop, + volume: Volume::Linear(0.6), + ..default() + }, + )); + + commands.spawn(( + Name::new("sfx-ambient"), + AudioPlayer::new(assets.ambient.clone()), + PlaybackSettings { + mode: PlaybackMode::Loop, + volume: Volume::Linear(0.8), + ..default() + }, + )); +} + +fn write_trenchbroom_config(server: Res, type_registry: Res) { + if let Err(e) = server + .config + .write_game_config("trenchbroom/hedz", &type_registry.read()) + { + warn!("Failed to write trenchbroom config: {}", e); + } +} + +fn set_tonemapping( + mut cams: Query<(&mut Tonemapping, &mut ColorGrading), With>, + visuals: Res, +) { + for (mut tm, mut color) in cams.iter_mut() { + *tm = visuals.tonemapping; + color.global.exposure = visuals.exposure; + } +} + +fn set_materials_unlit( + mut materials: ResMut>, + visuals: Res, +) { + if !materials.is_changed() { + return; + } + + for (_, material) in materials.iter_mut() { + material.unlit = visuals.unlit; + } +} + +fn set_shadows(mut lights: Query<&mut DirectionalLight>, visuals: Res) { + for mut l in lights.iter_mut() { + l.shadows_enabled = visuals.shadows; + } +} diff --git a/crates/shared/Cargo.toml b/crates/shared/Cargo.toml new file mode 100644 index 0000000..76b8cb9 --- /dev/null +++ b/crates/shared/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "shared" +version = "0.1.0" +edition = "2024" + +[features] +dbg = [] + +[dependencies] +avian3d = { workspace = true } +bevy = { workspace = true } +bevy-inspector-egui = { workspace = true, optional = true } +bevy-steamworks = { workspace = true } +bevy-ui-gradients = { workspace = true } +bevy_asset_loader = { workspace = true } +bevy_ballistic = { workspace = true } +bevy_common_assets = { workspace = true } +bevy_debug_log = { workspace = true } +bevy_sprite3d = { workspace = true } +bevy_trenchbroom = { workspace = true } +happy_feet = { workspace = true } +nil = { workspace = true } +rand = { workspace = true } +ron = { workspace = true } +serde = { workspace = true } +steamworks = { workspace = true } + +[lints.clippy] +too_many_arguments = "allow" +type_complexity = "allow" diff --git a/src/abilities/arrow.rs b/crates/shared/src/abilities/arrow.rs similarity index 100% rename from src/abilities/arrow.rs rename to crates/shared/src/abilities/arrow.rs diff --git a/src/abilities/curver.rs b/crates/shared/src/abilities/curver.rs similarity index 100% rename from src/abilities/curver.rs rename to crates/shared/src/abilities/curver.rs diff --git a/src/abilities/gun.rs b/crates/shared/src/abilities/gun.rs similarity index 100% rename from src/abilities/gun.rs rename to crates/shared/src/abilities/gun.rs diff --git a/src/abilities/healing.rs b/crates/shared/src/abilities/healing.rs similarity index 100% rename from src/abilities/healing.rs rename to crates/shared/src/abilities/healing.rs diff --git a/src/abilities/missile.rs b/crates/shared/src/abilities/missile.rs similarity index 100% rename from src/abilities/missile.rs rename to crates/shared/src/abilities/missile.rs diff --git a/src/abilities/mod.rs b/crates/shared/src/abilities/mod.rs similarity index 100% rename from src/abilities/mod.rs rename to crates/shared/src/abilities/mod.rs diff --git a/src/abilities/thrown.rs b/crates/shared/src/abilities/thrown.rs similarity index 100% rename from src/abilities/thrown.rs rename to crates/shared/src/abilities/thrown.rs diff --git a/src/ai/mod.rs b/crates/shared/src/ai/mod.rs similarity index 100% rename from src/ai/mod.rs rename to crates/shared/src/ai/mod.rs diff --git a/src/aim/marker.rs b/crates/shared/src/aim/marker.rs similarity index 100% rename from src/aim/marker.rs rename to crates/shared/src/aim/marker.rs diff --git a/src/aim/mod.rs b/crates/shared/src/aim/mod.rs similarity index 100% rename from src/aim/mod.rs rename to crates/shared/src/aim/mod.rs diff --git a/src/aim/target_ui.rs b/crates/shared/src/aim/target_ui.rs similarity index 100% rename from src/aim/target_ui.rs rename to crates/shared/src/aim/target_ui.rs diff --git a/src/animation.rs b/crates/shared/src/animation.rs similarity index 100% rename from src/animation.rs rename to crates/shared/src/animation.rs diff --git a/src/backpack/backpack_ui.rs b/crates/shared/src/backpack/backpack_ui.rs similarity index 100% rename from src/backpack/backpack_ui.rs rename to crates/shared/src/backpack/backpack_ui.rs diff --git a/src/backpack/mod.rs b/crates/shared/src/backpack/mod.rs similarity index 100% rename from src/backpack/mod.rs rename to crates/shared/src/backpack/mod.rs diff --git a/src/backpack/ui_head_state.rs b/crates/shared/src/backpack/ui_head_state.rs similarity index 100% rename from src/backpack/ui_head_state.rs rename to crates/shared/src/backpack/ui_head_state.rs diff --git a/src/camera.rs b/crates/shared/src/camera.rs similarity index 100% rename from src/camera.rs rename to crates/shared/src/camera.rs diff --git a/src/cash.rs b/crates/shared/src/cash.rs similarity index 100% rename from src/cash.rs rename to crates/shared/src/cash.rs diff --git a/src/cash_heal.rs b/crates/shared/src/cash_heal.rs similarity index 100% rename from src/cash_heal.rs rename to crates/shared/src/cash_heal.rs diff --git a/src/character.rs b/crates/shared/src/character.rs similarity index 100% rename from src/character.rs rename to crates/shared/src/character.rs diff --git a/src/control/controller_common.rs b/crates/shared/src/control/controller_common.rs similarity index 100% rename from src/control/controller_common.rs rename to crates/shared/src/control/controller_common.rs diff --git a/src/control/controller_flying.rs b/crates/shared/src/control/controller_flying.rs similarity index 100% rename from src/control/controller_flying.rs rename to crates/shared/src/control/controller_flying.rs diff --git a/src/control/controller_running.rs b/crates/shared/src/control/controller_running.rs similarity index 100% rename from src/control/controller_running.rs rename to crates/shared/src/control/controller_running.rs diff --git a/src/control/controls.rs b/crates/shared/src/control/controls.rs similarity index 100% rename from src/control/controls.rs rename to crates/shared/src/control/controls.rs diff --git a/src/control/mod.rs b/crates/shared/src/control/mod.rs similarity index 100% rename from src/control/mod.rs rename to crates/shared/src/control/mod.rs diff --git a/src/cutscene.rs b/crates/shared/src/cutscene.rs similarity index 100% rename from src/cutscene.rs rename to crates/shared/src/cutscene.rs diff --git a/src/gates.rs b/crates/shared/src/gates.rs similarity index 100% rename from src/gates.rs rename to crates/shared/src/gates.rs diff --git a/src/head.rs b/crates/shared/src/head.rs similarity index 100% rename from src/head.rs rename to crates/shared/src/head.rs diff --git a/src/head_drop.rs b/crates/shared/src/head_drop.rs similarity index 100% rename from src/head_drop.rs rename to crates/shared/src/head_drop.rs diff --git a/src/heads/heads_ui.rs b/crates/shared/src/heads/heads_ui.rs similarity index 100% rename from src/heads/heads_ui.rs rename to crates/shared/src/heads/heads_ui.rs diff --git a/src/heads/mod.rs b/crates/shared/src/heads/mod.rs similarity index 100% rename from src/heads/mod.rs rename to crates/shared/src/heads/mod.rs diff --git a/src/heads_database.rs b/crates/shared/src/heads_database.rs similarity index 100% rename from src/heads_database.rs rename to crates/shared/src/heads_database.rs diff --git a/src/heal_effect.rs b/crates/shared/src/heal_effect.rs similarity index 100% rename from src/heal_effect.rs rename to crates/shared/src/heal_effect.rs diff --git a/src/hitpoints.rs b/crates/shared/src/hitpoints.rs similarity index 100% rename from src/hitpoints.rs rename to crates/shared/src/hitpoints.rs diff --git a/src/keys.rs b/crates/shared/src/keys.rs similarity index 100% rename from src/keys.rs rename to crates/shared/src/keys.rs diff --git a/crates/shared/src/lib.rs b/crates/shared/src/lib.rs new file mode 100644 index 0000000..b8dabe2 --- /dev/null +++ b/crates/shared/src/lib.rs @@ -0,0 +1,51 @@ +pub mod abilities; +pub mod ai; +pub mod aim; +pub mod animation; +pub mod backpack; +pub mod camera; +pub mod cash; +pub mod cash_heal; +pub mod character; +pub mod control; +pub mod cutscene; +pub mod gates; +pub mod head; +pub mod head_drop; +pub mod heads; +pub mod heads_database; +pub mod heal_effect; +pub mod hitpoints; +pub mod keys; +pub mod loading_assets; +pub mod loading_map; +pub mod movables; +pub mod npc; +pub mod physics_layers; +pub mod platforms; +pub mod player; +pub mod sounds; +pub mod tb_entities; +pub mod utils; +pub mod water; + +use bevy::{core_pipeline::tonemapping::Tonemapping, prelude::*}; +use utils::{billboards, squish_animation}; + +#[derive(Resource, Reflect, Debug)] +#[reflect(Resource)] +pub struct DebugVisuals { + pub unlit: bool, + pub tonemapping: Tonemapping, + pub exposure: f32, + pub shadows: bool, + pub cam_follow: bool, +} + +#[derive(States, Default, Clone, Eq, PartialEq, Debug, Hash)] +pub enum GameState { + #[default] + AssetLoading, + MapLoading, + Playing, +} diff --git a/src/loading_assets.rs b/crates/shared/src/loading_assets.rs similarity index 100% rename from src/loading_assets.rs rename to crates/shared/src/loading_assets.rs diff --git a/src/loading_map.rs b/crates/shared/src/loading_map.rs similarity index 100% rename from src/loading_map.rs rename to crates/shared/src/loading_map.rs diff --git a/src/movables.rs b/crates/shared/src/movables.rs similarity index 100% rename from src/movables.rs rename to crates/shared/src/movables.rs diff --git a/src/npc.rs b/crates/shared/src/npc.rs similarity index 100% rename from src/npc.rs rename to crates/shared/src/npc.rs diff --git a/src/physics_layers.rs b/crates/shared/src/physics_layers.rs similarity index 100% rename from src/physics_layers.rs rename to crates/shared/src/physics_layers.rs diff --git a/src/platforms.rs b/crates/shared/src/platforms.rs similarity index 100% rename from src/platforms.rs rename to crates/shared/src/platforms.rs diff --git a/src/player.rs b/crates/shared/src/player.rs similarity index 100% rename from src/player.rs rename to crates/shared/src/player.rs diff --git a/src/sounds.rs b/crates/shared/src/sounds.rs similarity index 95% rename from src/sounds.rs rename to crates/shared/src/sounds.rs index 8db87d4..3e14c63 100644 --- a/src/sounds.rs +++ b/crates/shared/src/sounds.rs @@ -70,11 +70,11 @@ fn on_spawn_sounds( } } PlaySound::Head(name) => { - let filename = format!("{}.ogg", name); + let filename = format!("{name}.ogg"); assets .head .get(filename.as_str()) - .unwrap_or_else(|| panic!("invalid head '{}'", filename)) + .unwrap_or_else(|| panic!("invalid head '{filename}'")) .clone() } }; diff --git a/src/tb_entities.rs b/crates/shared/src/tb_entities.rs similarity index 99% rename from src/tb_entities.rs rename to crates/shared/src/tb_entities.rs index 1817aa0..13990a6 100644 --- a/src/tb_entities.rs +++ b/crates/shared/src/tb_entities.rs @@ -141,7 +141,7 @@ impl EnemySpawn { world.commands().entity(entity).insert(( this_transform, - Name::from(format!("enemy [{}]", head)), + Name::from(format!("enemy [{head}]")), Visibility::default(), RigidBody::Dynamic, Collider::capsule(0.6, 2.), diff --git a/src/utils/auto_rotate.rs b/crates/shared/src/utils/auto_rotate.rs similarity index 100% rename from src/utils/auto_rotate.rs rename to crates/shared/src/utils/auto_rotate.rs diff --git a/src/utils/billboards.rs b/crates/shared/src/utils/billboards.rs similarity index 100% rename from src/utils/billboards.rs rename to crates/shared/src/utils/billboards.rs diff --git a/src/utils/explosions.rs b/crates/shared/src/utils/explosions.rs similarity index 100% rename from src/utils/explosions.rs rename to crates/shared/src/utils/explosions.rs diff --git a/src/utils/mod.rs b/crates/shared/src/utils/mod.rs similarity index 100% rename from src/utils/mod.rs rename to crates/shared/src/utils/mod.rs diff --git a/src/utils/observers.rs b/crates/shared/src/utils/observers.rs similarity index 100% rename from src/utils/observers.rs rename to crates/shared/src/utils/observers.rs diff --git a/src/utils/sprite_3d_animation.rs b/crates/shared/src/utils/sprite_3d_animation.rs similarity index 100% rename from src/utils/sprite_3d_animation.rs rename to crates/shared/src/utils/sprite_3d_animation.rs diff --git a/src/utils/squish_animation.rs b/crates/shared/src/utils/squish_animation.rs similarity index 100% rename from src/utils/squish_animation.rs rename to crates/shared/src/utils/squish_animation.rs diff --git a/src/utils/trail.rs b/crates/shared/src/utils/trail.rs similarity index 100% rename from src/utils/trail.rs rename to crates/shared/src/utils/trail.rs diff --git a/src/water.rs b/crates/shared/src/water.rs similarity index 100% rename from src/water.rs rename to crates/shared/src/water.rs diff --git a/justfile b/justfile index 3c2b5a1..7820c4c 100644 --- a/justfile +++ b/justfile @@ -5,10 +5,20 @@ tb_setup_mac: ln -s $(pwd)/trenchbroom/hedz/hedz.fgd "$HOME/Library/Application Support/TrenchBroom/games/hedz/hedz.fgd" | true ln -s $(pwd)/trenchbroom/hedz/GameConfig.cfg "$HOME/Library/Application Support/TrenchBroom/games/hedz/GameConfig.cfg" | true +run: + RUST_BACKTRACE=1 cargo r --bin hedz_reloaded + dbg: - RUST_BACKTRACE=1 cargo r --features dbg + RUST_BACKTRACE=1 cargo r --bin hedz_reloaded --features dbg + +dbg-server: + RUST_BACKTRACE=1 cargo r --bin server --features dbg + +sort: + cargo sort check: + cargo sort --check --workspace cargo fmt --check cargo b cargo test