From aa9bcf7200f6a8ce6ed78b392414cbffad896788 Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Thu, 27 Nov 2025 18:08:02 -0600 Subject: [PATCH] feat: starguide dragging --- crates/unified/src/client/mod.rs | 9 ++-- crates/unified/src/client/rendering/mod.rs | 7 +-- .../{starguide.rs => starguide/init.rs} | 2 +- crates/unified/src/client/starguide/input.rs | 44 +++++++++++++++++++ crates/unified/src/client/starguide/mod.rs | 2 + crates/unified/src/client/zoom.rs | 13 ++++-- crates/unified/src/ecs.rs | 6 +++ 7 files changed, 71 insertions(+), 12 deletions(-) rename crates/unified/src/client/{starguide.rs => starguide/init.rs} (90%) create mode 100644 crates/unified/src/client/starguide/input.rs create mode 100644 crates/unified/src/client/starguide/mod.rs diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index ac2776d2fbf3967296fd85adef75ba0b7c9c5e20..12e7eb242607150972f18677df2664cdeeb427b2 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -4,14 +4,15 @@ use crate::client::planet::indicators::indicators_plugin; use crate::client::starfield::starfield_plugin; use crate::client::ui::ui_plugin; use crate::client::zoom::zoom_plugin; -use crate::client::starguide::starguide_plugin; +use crate::client::starguide::init::starguide_init_plugin; +use crate::client::starguide::input::starguide_input_plugin; use crate::ecs::{Hi, Part, Player}; use aeronet_websocket::client::WebSocketClient; use bevy::dev_tools::picking_debug::DebugPickingMode; use crate::prelude::*; use planet::incoming_planets::incoming_planets_plugin; use crate::client::ship::attachment::client_attachment_plugin; -use crate::ecs::{Me, STARGUIDE_LAYER}; +use crate::ecs::{Me, GameplayState, STARGUIDE_LAYER}; pub mod colors; pub mod key_input; @@ -55,7 +56,9 @@ impl Plugin for ClientPlugin { .add_plugins(ui_plugin) .add_plugins(zoom_plugin) .add_plugins(client_attachment_plugin) - .add_plugins(starguide_plugin) + .add_plugins(starguide_init_plugin) + .add_plugins(starguide_input_plugin) + .insert_state(GameplayState::Main) .insert_resource(DebugPickingMode::Disabled); // These are only needed if we're actually doing network things diff --git a/crates/unified/src/client/rendering/mod.rs b/crates/unified/src/client/rendering/mod.rs index b1bdd091a54b80d35f454163b4c740d678832850..7510bff7e31500c293abf54cec727e2b251139ff 100644 --- a/crates/unified/src/client/rendering/mod.rs +++ b/crates/unified/src/client/rendering/mod.rs @@ -2,13 +2,13 @@ use bevy::anti_alias::fxaa::Fxaa; use bevy::app::{App, Startup}; use bevy::core_pipeline::tonemapping::DebandDither; use bevy::post_process::bloom::Bloom; -use crate::ecs::{MainCamera, StarguideCamera, Me, MAIN_LAYER}; +use crate::ecs::{GameplayState, MainCamera, StarguideCamera, Me, MAIN_LAYER}; use crate::prelude::*; pub fn render_plugin(app: &mut App) { app .add_systems(Startup, setup_graphics) - .add_systems(Update, follow_camera); + .add_systems(Update, follow_camera.run_if(in_state(GameplayState::Main))); } @@ -32,11 +32,8 @@ fn follow_camera( player: Query<&Transform, With>, ) { let mut camera = camera.single_mut().unwrap(); - let mut starguide_camera = starguide_camera.single_mut().unwrap(); let Ok(player) = player.single() else { return; }; camera.translation = player.translation; - starguide_camera.translation = player.translation; - } diff --git a/crates/unified/src/client/starguide.rs b/crates/unified/src/client/starguide/init.rs similarity index 90% rename from crates/unified/src/client/starguide.rs rename to crates/unified/src/client/starguide/init.rs index 60c365cfbb7288a5beb8ea3884f19a10cf46ad5e..e66fda86b01a6f19e03153e8e9b36acf94a14198 100644 --- a/crates/unified/src/client/starguide.rs +++ b/crates/unified/src/client/starguide/init.rs @@ -3,7 +3,7 @@ use crate::ecs::{StarguideCamera, STARGUIDE_LAYER}; use crate::config::planet::SpecialSpriteProperties; use crate::config::planet::Planet; -pub fn starguide_plugin(app: &mut App) { +pub fn starguide_init_plugin(app: &mut App) { app.add_systems(Startup, init_starguide); } diff --git a/crates/unified/src/client/starguide/input.rs b/crates/unified/src/client/starguide/input.rs new file mode 100644 index 0000000000000000000000000000000000000000..60238c2928cea6dc3c4ec6e46760ba58b83605b6 --- /dev/null +++ b/crates/unified/src/client/starguide/input.rs @@ -0,0 +1,44 @@ +use crate::prelude::*; +use crate::client::input::CursorWorldCoordinates; +use crate::ecs::StarguideCamera; + +pub fn starguide_input_plugin(app: &mut App) { + app + .add_systems(Update, (on_click, starguide_drag)) + .insert_resource(StarguideDrag::default()); +} + +#[derive(Resource, Default)] +struct StarguideDrag { + is_dragging: bool, + init_cursor_pos: Vec2, + init_camera_pos: Vec2, +} + +fn on_click( + ev: Res>, + mut drag: ResMut, + camera: Single<&Transform, With>, + cursor: Res +) { + let Some(cursor) = cursor.0 else { return }; + if ev.just_pressed(MouseButton::Left) { + drag.is_dragging = true; + drag.init_cursor_pos = cursor; + drag.init_camera_pos = camera.translation.truncate(); + } + if ev.just_released(MouseButton::Left) { + drag.is_dragging = false; + } +} + +fn starguide_drag( + drag: ResMut, + mut camera: Single<&mut Transform, (With)>, + cursor: Res, +) { + if !drag.is_dragging { return } + let Some(cursor) = cursor.0 else { return }; + + camera.translation = drag.init_camera_pos.extend(0.0) - (cursor - drag.init_cursor_pos).extend(0.0); +} diff --git a/crates/unified/src/client/starguide/mod.rs b/crates/unified/src/client/starguide/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..a703db4fd731ef908ce56dc152db74b4559c3636 --- /dev/null +++ b/crates/unified/src/client/starguide/mod.rs @@ -0,0 +1,2 @@ +pub mod init; +pub mod input; diff --git a/crates/unified/src/client/zoom.rs b/crates/unified/src/client/zoom.rs index 6b45e08f397fbef4160b345005fb4bc596172dbb..83df57c061fbcf56d475d43c91a5e5d45c0a66ff 100644 --- a/crates/unified/src/client/zoom.rs +++ b/crates/unified/src/client/zoom.rs @@ -6,7 +6,7 @@ use bevy::{ use crate::{ client::starfield::{BACK_STARFIELD_SIZE, FRONT_STARFIELD_SIZE, MID_STARFIELD_SIZE, StarfieldSize}, ecs::{MainCamera, Me, StarfieldBack, StarfieldFront, StarfieldMid} }; -use crate::ecs::StarguideCamera; +use crate::ecs::{StarguideCamera, GameplayState}; pub fn zoom_plugin(app: &mut App) { app.add_systems(Update, on_scroll); @@ -14,6 +14,8 @@ pub fn zoom_plugin(app: &mut App) { fn on_scroll( mut scroll_events: MessageReader, + gameplay_state: Res>, + mut gameplay_next_state: ResMut>, window: Single<&Window>, starfield_back: Single< (&mut Sprite, &mut Transform, &mut Visibility, Option<&StarfieldSize>), @@ -87,17 +89,22 @@ fn on_scroll( camera.1.scale *= 1.03; starguide_camera.1.scale *= 1.03; } - if camera.1.scale.z > 30.0 { + if camera.1.scale.z > 20.0 && matches!(gameplay_state.get(), GameplayState::Main) { camera.0.is_active = false; starguide_camera.0.is_active = true; + + starguide_camera.1.translation = player.translation; + gameplay_next_state.set(GameplayState::Starguide); + starfield_back.image_mode = SpriteImageMode::Auto; starfield_mid.image_mode = SpriteImageMode::Auto; starfield_front.image_mode = SpriteImageMode::Auto; *visibility_back = Visibility::Hidden; *visibility_mid = Visibility::Hidden; *visibility_front = Visibility::Hidden; - } else { + } else if camera.1.scale.z <= 20.0 && matches!(gameplay_state.get(), GameplayState::Starguide) { camera.0.is_active = true; + gameplay_next_state.set(GameplayState::Main); starguide_camera.0.is_active = false; if matches!(*visibility_back, Visibility::Hidden) { if let Some(size_back) = size_back { diff --git a/crates/unified/src/ecs.rs b/crates/unified/src/ecs.rs index 609e40a67d6d46b19a25ee8e7d6b2a7cf19cbdc2..dca317496565fdf8e23c73d0144c33b1d77cf4b3 100644 --- a/crates/unified/src/ecs.rs +++ b/crates/unified/src/ecs.rs @@ -11,6 +11,12 @@ use avian2d::prelude::*; use crate::thrust::ThrustSolution; use std::sync::LazyLock; +#[derive(States, Debug, Clone, PartialEq, Eq, Hash)] +pub enum GameplayState { + Main, + Starguide, +} + pub const MAIN_LAYER: RenderLayers = RenderLayers::layer(0); pub const STARGUIDE_LAYER: RenderLayers = RenderLayers::layer(1); pub static MAIN_STAR_LAYERS: LazyLock = LazyLock::new(|| RenderLayers::from_layers(&[0, 1]));