From acd7621cd003ebaf380f59fdceaa9459ba91fcb2 Mon Sep 17 00:00:00 2001 From: core Date: Sun, 17 May 2026 14:10:11 -0400 Subject: [PATCH] chore(netcode-rewrite): further code cleanup & simplification --- crates/unified/src/client/crafting/ui.rs | 107 +++++++----------- crates/unified/src/client/parts.rs | 8 +- .../src/client/planet/incoming_planets.rs | 45 +++----- .../unified/src/client/planet/indicators.rs | 10 +- crates/unified/src/client/starfield.rs | 48 ++++---- crates/unified/src/client/starguide/init.rs | 10 +- crates/unified/src/client/starguide/input.rs | 2 - crates/unified/src/client/starguide/orbit.rs | 6 +- crates/unified/src/client/ui.rs | 10 -- crates/unified/src/client/zoom.rs | 97 ++++------------ crates/unified/src/server/craft.rs | 4 +- crates/unified/src/server/drill.rs | 92 ++++++--------- crates/unified/src/server/heat/radiation.rs | 5 +- crates/unified/src/server/orbit/mod.rs | 24 +++- crates/unified/src/server/part.rs | 2 +- crates/unified/src/server/planets.rs | 37 ++---- crates/unified/src/server/player.rs | 4 +- crates/unified/src/server/player/join.rs | 14 ++- crates/unified/src/shared/config/planet.rs | 3 +- crates/unified/src/shared/config/world.rs | 4 +- crates/unified/src/shared/ecs.rs | 2 +- crates/unified/src/shared/plugins.rs | 20 +--- 22 files changed, 203 insertions(+), 351 deletions(-) diff --git a/crates/unified/src/client/crafting/ui.rs b/crates/unified/src/client/crafting/ui.rs index 6e8bfc9036fbc510c404aba81d7086dffa98307f..c1e31eec25ffa6c3752121d9f1dc6d0cea38e7a0 100644 --- a/crates/unified/src/client/crafting/ui.rs +++ b/crates/unified/src/client/crafting/ui.rs @@ -37,7 +37,23 @@ struct RecipeCollection { } // TODO: use recipe inputs for client-side validation? #[derive(Component, Clone)] -struct RecipeElement(Entity, String, HashMap); // stores corresponding part and recipe's part name and inputs +struct RecipeElement { + part_entity: Entity, + module_name: String, + inputs: HashMap, +} + +fn click_released(current: Interaction, previous: Interaction) -> bool { + current == Interaction::Hovered && previous == Interaction::Pressed +} + +fn button_color(interaction: Interaction, pressed: Color, hovered: Color, none: Color) -> BackgroundColor { + match interaction { + Interaction::Pressed => pressed.into(), + Interaction::Hovered => hovered.into(), + Interaction::None => none.into(), + } +} fn load_recipes(asset_server: Res, mut recipe_collection: ResMut) { recipe_collection.handle = Some(asset_server.load("config/recipes.rc.toml")); @@ -239,7 +255,7 @@ fn create_recipe_list( width: Val::Auto, ..Default::default() }, - RecipeElement(parent_entity, module_name.clone(), recipe.inputs.clone()), + RecipeElement { part_entity: parent_entity, module_name: module_name.clone(), inputs: recipe.inputs.clone() }, BackgroundColor(colors::MANTLE), PreviousInteraction(Interaction::None), Button), @@ -269,24 +285,13 @@ fn recipe_buttons( mut crafting_message_writer: MessageWriter, ) { for (interaction, mut previous_interaction, mut color, recipe) in &mut interaction_query { - match *interaction { - Interaction::Pressed => { - *color = colors::SURFACE_1.into(); - } - Interaction::Hovered => { - *color = colors::SURFACE_0.into(); - if previous_interaction.0 == Interaction::Pressed { - // released - crafting_message_writer.write(CraftPartRequest { - crafting_part: recipe.0, - crafted_part: recipe.1.clone(), - inputs: recipe.2.clone(), - }); - } - } - Interaction::None => { - *color = colors::MANTLE.into(); - } + *color = button_color(*interaction, colors::SURFACE_1, colors::SURFACE_0, colors::MANTLE); + if click_released(*interaction, previous_interaction.0) { + crafting_message_writer.write(CraftPartRequest { + crafting_part: recipe.part_entity, + crafted_part: recipe.module_name.clone(), + inputs: recipe.inputs.clone(), + }); } previous_interaction.0 = *interaction; } @@ -309,35 +314,18 @@ fn drill_button( drills: Query<&Drill>, ) { for (interaction, mut previous_interaction, mut color, drill_button, _button, children) in &mut interaction_query { - match *interaction { - Interaction::Pressed => { - *color = colors::SURFACE_1.into(); - } - Interaction::Hovered => { - *color = colors::SURFACE_0.into(); - if previous_interaction.0 == Interaction::Pressed { - // released - let mut text = text_query.get_mut(children[0]).unwrap(); - let Ok(drill) = drills.get(drill_button.0) else { - error!("A former drill is now not a drill, causing a problem in the drill button"); - previous_interaction.0 = *interaction; - return - }; - // don't allow drill toggling while not on a planet - if drill.on_planet.is_none() { return } - // the text is flipped because drill.drilling is an old value, - // which was now toggled - if drill.drilling { - **text = "Start Drill".to_string(); - } else { - **text = "Stop Drill".to_string(); - } - toggle_drill_writer.write(ToggleDrillEvent { drill_entity: drill_button.0 }); - } - } - Interaction::None => { - *color = colors::CRUST.into(); - } + *color = button_color(*interaction, colors::SURFACE_1, colors::SURFACE_0, colors::CRUST); + if click_released(*interaction, previous_interaction.0) { + let mut text = text_query.get_mut(children[0]).unwrap(); + let Ok(drill) = drills.get(drill_button.0) else { + error!("A former drill is now not a drill, causing a problem in the drill button"); + previous_interaction.0 = *interaction; + return + }; + if drill.on_planet.is_none() { return } + // text is flipped because drill.drilling is the pre-toggle value + **text = if drill.drilling { "Start Drill" } else { "Stop Drill" }.to_string(); + toggle_drill_writer.write(ToggleDrillEvent { drill_entity: drill_button.0 }); } previous_interaction.0 = *interaction; } @@ -396,24 +384,11 @@ fn close_button( (&Interaction, &mut PreviousInteraction, &mut BackgroundColor, &CloseButton, &mut Button), Changed, >, - _mouse: Res>, ) { - for (interaction, mut previous_interaction, mut color, - close_button, _button) in &mut interaction_query - { - match *interaction { - Interaction::Pressed => { - *color = colors::MAROON.into(); - } - Interaction::Hovered => { - *color = colors::PINK.into(); - if previous_interaction.0 == Interaction::Pressed { - commands.entity(close_button.0).despawn(); - } - } - Interaction::None => { - *color = colors::RED.into(); - } + for (interaction, mut previous_interaction, mut color, close_button, _button) in &mut interaction_query { + *color = button_color(*interaction, colors::MAROON, colors::PINK, colors::RED); + if click_released(*interaction, previous_interaction.0) { + commands.entity(close_button.0).despawn(); } previous_interaction.0 = *interaction; } diff --git a/crates/unified/src/client/parts.rs b/crates/unified/src/client/parts.rs index 457d977d19ab128c8216cd74dbaa8129544e4349..7e529f7a711dab04ee53e1b56ac60225b48c3905 100644 --- a/crates/unified/src/client/parts.rs +++ b/crates/unified/src/client/parts.rs @@ -33,14 +33,14 @@ fn temp_to_color(temperature: &Temperature) -> Color { fn build_part_sprite(part: &Part, temperature: &Temperature, is_connected: bool, asset_server: &AssetServer) -> Sprite { let path = if is_connected { - &part.strong_config.part.sprite_connected + &part.config.part.sprite_connected } else { - &part.strong_config.part.sprite_disconnected + &part.config.part.sprite_disconnected }; let mut sprite = Sprite::from_image(asset_server.load(path)); sprite.custom_size = Some(Vec2::new( - part.strong_config.physics.width as f32, - part.strong_config.physics.height as f32, + part.config.physics.width as f32, + part.config.physics.height as f32, )); sprite.color = temp_to_color(temperature); sprite diff --git a/crates/unified/src/client/planet/incoming_planets.rs b/crates/unified/src/client/planet/incoming_planets.rs index 8ee2fdb81ccdff21fd29c68d5a5f357878d17079..5295ef8e52688703c3eabfdbe7bc6a7271b4f7ee 100644 --- a/crates/unified/src/client/planet/incoming_planets.rs +++ b/crates/unified/src/client/planet/incoming_planets.rs @@ -6,54 +6,37 @@ pub fn incoming_planets_plugin(app: &mut App) { app.add_systems(Update, (handle_incoming_planets, handle_updated_planets)); } +fn build_planet_sprite(planet: &Planet, asset_server: &AssetServer) -> Sprite { + let mut sprite = Sprite::from_image(asset_server.load(&planet.sprite)); + sprite.custom_size = Some(Vec2::splat(planet.radius as f32 * 2.0)); + if let Some(SpecialSpriteProperties::ForceColor(c)) = planet.special_sprite_properties { + sprite.color = c; + } + sprite +} + fn handle_incoming_planets( mut commands: Commands, new_planets: Query<(Entity, &Planet), Added>, asset_server: Res, ) { for (new_entity, new_planet) in new_planets.iter() { - let mut sprite = Sprite::from_image(asset_server.load(&new_planet.sprite)); - sprite.custom_size = Some(Vec2::new(new_planet.radius as f32 * 2.0, new_planet.radius as f32 * 2.0)); - - if let Some(SpecialSpriteProperties::ForceColor(c)) = new_planet.special_sprite_properties { - sprite.color = c; - } - - let mut commands = commands.entity(new_entity); - - commands - //.insert(AdditionalMassProperties::Mass(new_planet.mass)) + commands.entity(new_entity) .insert(MAIN_STAR_LAYERS.clone()) - .insert(sprite); - + .insert(build_planet_sprite(new_planet, &asset_server)); trace!(?new_planet, "prepared new planet"); } } + fn handle_updated_planets( mut commands: Commands, updated_planets: Query<(Entity, &Planet), Changed>, asset_server: Res, ) { for (updated_entity, updated_planet) in updated_planets.iter() { - let mut sprite = Sprite::from_image(asset_server.load(&updated_planet.sprite)); - sprite.custom_size = Some(Vec2::new( - updated_planet.radius as f32 * 2.0, - updated_planet.radius as f32 * 2.0, - )); - - if let Some(SpecialSpriteProperties::ForceColor(c)) = - updated_planet.special_sprite_properties - { - sprite.color = c; - } - - let mut commands = commands.entity(updated_entity); - commands - //.remove::() - //.insert(AdditionalMassProperties::Mass(updated_planet.mass)) + commands.entity(updated_entity) .remove::() - .insert(sprite); - + .insert(build_planet_sprite(updated_planet, &asset_server)); trace!(?updated_planet, "updated planet"); } } diff --git a/crates/unified/src/client/planet/indicators.rs b/crates/unified/src/client/planet/indicators.rs index 01c1099145848f94154134d0e2df06a97aab302a..226afc7af5f7f4ab67750b0e1f024496ba573d9c 100644 --- a/crates/unified/src/client/planet/indicators.rs +++ b/crates/unified/src/client/planet/indicators.rs @@ -4,6 +4,10 @@ use crate::client::components::MainCamera; use crate::prelude::*; use bevy::window::PrimaryWindow; +const INDICATOR_SPRITE_SIZE: f32 = 25.0; +const INDICATOR_LARGE_SPRITE_SIZE: f32 = 50.0; +const INDICATOR_CAMERA_SCALE_FACTOR: f32 = 32.0; + pub fn indicators_plugin(app: &mut App) { app.add_systems(PreUpdate, (add_indicators, update_indicators)) .add_systems(PostUpdate, update_indicators_position); @@ -28,7 +32,7 @@ fn add_indicators( continue; }; let mut sprite = Sprite::from_image(asset_server.load(indicator_url)); - sprite.custom_size = Some(Vec2::new(25.0, 25.0)); + sprite.custom_size = Some(Vec2::splat(INDICATOR_SPRITE_SIZE)); let indicator = commands .spawn(( ChildOf(me), @@ -50,7 +54,7 @@ fn update_indicators( continue; }; let mut sprite = Sprite::from_image(asset_server.load(indicator_sprite)); - sprite.custom_size = Some(Vec2::new(50.0, 50.0)); + sprite.custom_size = Some(Vec2::splat(INDICATOR_LARGE_SPRITE_SIZE)); commands .entity(indicator.0) .remove::() @@ -80,7 +84,7 @@ fn update_indicators_position( for (planet_position, indicator_id) in &planets_w_indicator { let mut offset = planet_position.translation - player_position.translation; - let sprite_size = 32.0 * camera.scale.z; + let sprite_size = INDICATOR_CAMERA_SCALE_FACTOR * camera.scale.z; let half_window_height = window.height() * camera.scale.z / 2.0 - (sprite_size / 2.0); let half_window_width = window.width() * camera.scale.z / 2.0 - (sprite_size / 2.0); diff --git a/crates/unified/src/client/starfield.rs b/crates/unified/src/client/starfield.rs index 24fdd51bdf6419b5648ecc6e9bfcc20f3dd5dcdc..2d7c0f9258e81ee6108caf0c2b6dbe758320b3e4 100644 --- a/crates/unified/src/client/starfield.rs +++ b/crates/unified/src/client/starfield.rs @@ -2,8 +2,6 @@ use bevy::{ app::{App, Startup, Update}, asset::{AssetEvent, AssetServer, Assets}, ecs::{ - //entity::Entity, - //entity_disabling::Disabled, query::{With, Without}, system::{Commands, Query, Res, Single}, }, @@ -202,11 +200,6 @@ pub fn resize_starfield( return }; - /*if camera.scale.z > 10.0 { // arbitrary - // TODO: find out how to disable sprites // done - } else { - // TODO: find out how to reenable them without toggling on every update :( - }*/ starfield_back.custom_size = Some( Vec2::new(event.width, event.height) * projection.scale + Vec2::splat(BACK_STARFIELD_SIZE * 2.0), @@ -222,6 +215,21 @@ pub fn resize_starfield( } } +pub fn parallax_layer_translation( + player_pos: Vec3, + window_size: Vec2, + camera_scale: f32, + parallax_factor: f32, + field_size: f32, + z: f32, +) -> Vec3 { + player_pos + + (-player_pos / parallax_factor) % field_size + + (Vec3::new(window_size.x, -window_size.y, 0.0) * camera_scale / 2.0) % field_size + + Vec3::new(0.0, field_size, 0.0) + - Vec3::new(0.0, 0.0, z) +} + macro_rules! fix_negative_field_translations { ($field:ident, $size:expr) => { if $field.translation.y < $size / 2.0 { @@ -283,28 +291,10 @@ pub fn update_starfield( let mut starfield_back_pos = starfield_back.single_mut().unwrap(); let mut starfield_mid_pos = starfield_mid.single_mut().unwrap(); let mut starfield_front_pos = starfield_front.single_mut().unwrap(); - //starfield_pos.translation = (player.translation / STARFIELD_SIZE).round() * STARFIELD_SIZE; - starfield_back_pos.translation = player.translation - + (-player.translation / 3.0) % BACK_STARFIELD_SIZE - + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) * projection.scale - / 2.0) - % BACK_STARFIELD_SIZE - + Vec3::new(0.0, BACK_STARFIELD_SIZE, 0.0) - - Vec3::new(0.0, 0.0, 5.0); - starfield_mid_pos.translation = player.translation - + (-player.translation / 2.5) % MID_STARFIELD_SIZE - + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) * projection.scale - / 2.0) - % MID_STARFIELD_SIZE - + Vec3::new(0.0, MID_STARFIELD_SIZE, 0.0) - - Vec3::new(0.0, 0.0, 4.5); - starfield_front_pos.translation = player.translation - + (-player.translation / 2.0) % FRONT_STARFIELD_SIZE - + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) * projection.scale - / 2.0) - % FRONT_STARFIELD_SIZE - + Vec3::new(0.0, FRONT_STARFIELD_SIZE, 0.0) - - Vec3::new(0.0, 0.0, 4.0); + let win = window.size(); + starfield_back_pos.translation = parallax_layer_translation(player.translation, win, projection.scale, 3.0, BACK_STARFIELD_SIZE, 5.0); + starfield_mid_pos.translation = parallax_layer_translation(player.translation, win, projection.scale, 2.5, MID_STARFIELD_SIZE, 4.5); + starfield_front_pos.translation = parallax_layer_translation(player.translation, win, projection.scale, 2.0, FRONT_STARFIELD_SIZE, 4.0); fix_negative_field_translations!(starfield_back_pos, BACK_STARFIELD_SIZE); fix_negative_field_translations!(starfield_mid_pos, MID_STARFIELD_SIZE); diff --git a/crates/unified/src/client/starguide/init.rs b/crates/unified/src/client/starguide/init.rs index 39b515e973e0979672aeca62e9ced056c1ca9cbf..b2d2928d93e7c23f8ee55416f06d05a5f3d67c26 100644 --- a/crates/unified/src/client/starguide/init.rs +++ b/crates/unified/src/client/starguide/init.rs @@ -6,6 +6,8 @@ use crate::client::starguide::components::{StarguideCamera, StarguideMe, Stargui use crate::prelude::*; use crate::shared::ecs::{Part, STARGUIDE_LAYER}; +const STARGUIDE_RENDER_SCALE: f32 = 10.0; + pub fn starguide_init_plugin(app: &mut App) { app .add_systems(Startup, init_starguide) @@ -33,13 +35,13 @@ pub fn player_init( mut commands: Commands, asset_server: Res, ) { - let mut sprite = Sprite::from_image(asset_server.load(&me.2.strong_config.part.sprite_connected)); + let mut sprite = Sprite::from_image(asset_server.load(&me.2.config.part.sprite_connected)); sprite.custom_size = Some(Vec2::new( - me.2.strong_config.physics.width as f32, - me.2.strong_config.physics.height as f32, + me.2.config.physics.width as f32, + me.2.config.physics.height as f32, )); commands.spawn((sprite, StarguideMe, STARGUIDE_LAYER, - Transform::from_scale(Vec3::splat(10.0)))); + Transform::from_scale(Vec3::splat(STARGUIDE_RENDER_SCALE)))); } fn player_position_update( diff --git a/crates/unified/src/client/starguide/input.rs b/crates/unified/src/client/starguide/input.rs index 8968bcc1ffa66fff792095e7c4f41a0000178cc9..d0307038840cc3b34aec5cb1bc83792afaec950a 100644 --- a/crates/unified/src/client/starguide/input.rs +++ b/crates/unified/src/client/starguide/input.rs @@ -35,12 +35,10 @@ fn on_click( fn starguide_drag( drag: ResMut, mut camera: Single<&mut Transform, With>, - //mut orbit: Single<&mut Transform, (With, Without)>, 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); - //orbit.translation = drag.init_camera_pos.extend(0.0) - (cursor - drag.init_cursor_pos).extend(0.0); } diff --git a/crates/unified/src/client/starguide/orbit.rs b/crates/unified/src/client/starguide/orbit.rs index 0a0dd93b89bdf1eb26f4804e99b8888a9961507b..188c9b2e059e48ecfc558c11275a894bf23fb55f 100644 --- a/crates/unified/src/client/starguide/orbit.rs +++ b/crates/unified/src/client/starguide/orbit.rs @@ -5,6 +5,8 @@ use crate::prelude::*; use crate::shared::config::planet::Planet; use crate::shared::world_config::WorldConfigResource; +const ORBIT_CURVE_STEPS: usize = 200; + pub fn starguide_orbit_plugin(app: &mut App) { app .add_systems(Update, update_orbits); @@ -68,8 +70,8 @@ fn update_orbits( // 200 steps in the revolution let mut first_pos = None; let mut last_pos = None; - for i in 0..200 { - let theta = 2.0*PI*(i as f64)/200.0; + for i in 0..ORBIT_CURVE_STEPS { + let theta = 2.0*PI*(i as f64)/(ORBIT_CURVE_STEPS as f64); let r = (1.0/2.0) * ((f_x*f_x + f_y*f_y - 4.0*a*a) / (-2.0*a - f_x*theta.cos() - f_y*theta.sin())); if r < 0.0 { continue } diff --git a/crates/unified/src/client/ui.rs b/crates/unified/src/client/ui.rs index 9379aaa5ba3de6ddb026e8eb3821c356b125a455..ff2d935e0e2b5ed3cf94d8ed3a28c4402d0270b0 100644 --- a/crates/unified/src/client/ui.rs +++ b/crates/unified/src/client/ui.rs @@ -36,16 +36,6 @@ fn setup_ui(camera: Single, With)>, mut comman children![ (TextColor(colors::PEACH), Text::new("Fuel: 25"), FuelText,), (TextColor(colors::PEACH), Text::new("Power: 25"), PowerText,), - /*( - Node { - width: Val::Percent(100.0), - height: Val::Px(20.0), - margin: UiRect::all(Val::Px(5.0)), - ..Default::default() - }, - BorderRadius::all(Val::Px(5.0)), - BackgroundColor(colors::CRUST), - )*/ ], )], Visibility::Visible diff --git a/crates/unified/src/client/zoom.rs b/crates/unified/src/client/zoom.rs index 5addf10f8ddb19f22a9616b4824a81a964f16c06..23ea6cde3d7e8c0de34275fe6d49d2c07fcabc98 100644 --- a/crates/unified/src/client/zoom.rs +++ b/crates/unified/src/client/zoom.rs @@ -3,9 +3,20 @@ use bevy::{ prelude::*, }; use crate::client::components::{MainCamera, Me}; -use crate::client::starfield::{StarfieldSize, BACK_STARFIELD_SIZE, FRONT_STARFIELD_SIZE, MID_STARFIELD_SIZE}; +use crate::client::starfield::{parallax_layer_translation, StarfieldSize, BACK_STARFIELD_SIZE, FRONT_STARFIELD_SIZE, MID_STARFIELD_SIZE}; use crate::client::starguide::components::{StarfieldBack, StarfieldFront, StarfieldMid, StarguideCamera}; use crate::shared::ecs::GameplayState; + +fn restore_tiled(sprite: &mut Sprite, size: Option<&StarfieldSize>) { + if let Some(size) = size { + sprite.image_mode = SpriteImageMode::Tiled { + tile_x: true, + tile_y: true, + stretch_value: size.0, + }; + } +} + pub fn zoom_plugin(app: &mut App) { app.add_systems(Update, on_scroll); } @@ -50,18 +61,6 @@ fn on_scroll( Without, ), >, - /*mut orbit_camera: Single< - &mut Camera, - ( - - Without, - Without, - Without, - Without, - Without, - Without, - ), - >,*/ mut camera: Single< (&mut Camera, &mut Projection), ( @@ -83,19 +82,6 @@ fn on_scroll( Without, ), >, - /*mut starguide_orbit: Single< - &mut Transform, - ( - With, - Without, - Without, - Without, - Without, - Without, - - Without, - ), - >,*/ ) { let (mut starfield_back, mut starfield_back_pos, mut visibility_back, size_back) = starfield_back.into_inner(); @@ -114,15 +100,10 @@ fn on_scroll( camera_projection.scale *= 1.03; starguide_projection.scale *= 1.03; } - //starguide_orbit.scale = Vec3::splat(starguide_projection.scale); - if camera_projection.scale > 20.0 && matches!(gameplay_state.get(), GameplayState::Main) { camera.0.is_active = false; starguide_camera.0.is_active = true; - //orbit_camera.is_active = true; - starguide_camera.2.translation = player.translation; - //starguide_orbit.translation = player.translation; gameplay_next_state.set(GameplayState::Starguide); starfield_back.image_mode = SpriteImageMode::Auto; @@ -135,30 +116,10 @@ fn on_scroll( camera.0.is_active = true; gameplay_next_state.set(GameplayState::Main); starguide_camera.0.is_active = false; - //orbit_camera.is_active = false; - if matches!(*visibility_back, Visibility::Hidden) { - if let Some(size_back) = size_back { - starfield_back.image_mode = SpriteImageMode::Tiled { - tile_x: true, - tile_y: true, - stretch_value: size_back.0, - }; - } - if let Some(size_mid) = size_mid { - starfield_mid.image_mode = SpriteImageMode::Tiled { - tile_x: true, - tile_y: true, - stretch_value: size_mid.0, - }; - } - if let Some(size_front) = size_front{ - starfield_front.image_mode = SpriteImageMode::Tiled { - tile_x: true, - tile_y: true, - stretch_value: size_front.0, - }; - } + restore_tiled(&mut starfield_back, size_back); + restore_tiled(&mut starfield_mid, size_mid); + restore_tiled(&mut starfield_front, size_front); } *visibility_back = Visibility::Inherited; *visibility_mid = Visibility::Inherited; @@ -170,30 +131,10 @@ fn on_scroll( Some(window.size() * camera_projection.scale + Vec2::splat(MID_STARFIELD_SIZE * 2.0)); starfield_front.custom_size = Some(window.size() * camera_projection.scale + Vec2::splat(FRONT_STARFIELD_SIZE * 2.0)); - starfield_back_pos.translation = player.translation - + (-player.translation / 3.0) % BACK_STARFIELD_SIZE - + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) - * camera_projection.scale - / 2.0) - % BACK_STARFIELD_SIZE - + Vec3::new(0.0, BACK_STARFIELD_SIZE, 0.0) - - Vec3::new(0.0, 0.0, 5.0); - starfield_mid_pos.translation = player.translation - + (-player.translation / 2.5) % MID_STARFIELD_SIZE - + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) - * camera_projection.scale - / 2.0) - % MID_STARFIELD_SIZE - + Vec3::new(0.0, MID_STARFIELD_SIZE, 0.0) - - Vec3::new(0.0, 0.0, 4.5); - starfield_front_pos.translation = player.translation - + (-player.translation / 2.0) % FRONT_STARFIELD_SIZE - + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) - * camera_projection.scale - / 2.0) - % FRONT_STARFIELD_SIZE - + Vec3::new(0.0, FRONT_STARFIELD_SIZE, 0.0) - - Vec3::new(0.0, 0.0, 4.0); + let win = window.size(); + starfield_back_pos.translation = parallax_layer_translation(player.translation, win, camera_projection.scale, 3.0, BACK_STARFIELD_SIZE, 5.0); + starfield_mid_pos.translation = parallax_layer_translation(player.translation, win, camera_projection.scale, 2.5, MID_STARFIELD_SIZE, 4.5); + starfield_front_pos.translation = parallax_layer_translation(player.translation, win, camera_projection.scale, 2.0, FRONT_STARFIELD_SIZE, 4.0); } } } diff --git a/crates/unified/src/server/craft.rs b/crates/unified/src/server/craft.rs index cf01bdadfea8e94ab776883d7cd2083a1ae860ff..a11afa4702c08f4b44637bf7e2302206977ecbea 100644 --- a/crates/unified/src/server/craft.rs +++ b/crates/unified/src/server/craft.rs @@ -4,6 +4,8 @@ use crate::{prelude::*, server::part::{SpawnPartBundle, SpawnPartRequest}}; use crate::shared::attachment::{PartInShip, Parts}; use crate::shared::ecs::{CraftPartRequest, Part, Player, SingleStorage, VariableStorage}; +const CRAFTED_PART_SPAWN_OFFSET: f32 = 50.0; + pub fn craft_plugin(app: &mut App) { app.add_systems(Update, receive_crafting_request); } @@ -114,7 +116,7 @@ fn receive_crafting_request( commands.spawn(SpawnPartBundle { req: SpawnPartRequest(asset_server.load( format!("config/parts/{}.part.toml", request.crafted_part.to_lowercase()))), - transform: transform.with_translation(transform.translation + vec3(50.0, 0.0, 0.0)), + transform: transform.with_translation(transform.translation + vec3(CRAFTED_PART_SPAWN_OFFSET, 0.0, 0.0)), vel: *vel, }); } diff --git a/crates/unified/src/server/drill.rs b/crates/unified/src/server/drill.rs index 6019506c4d45d54a36f691b04838401a64cb48d0..cd7689cf30182f00875296e218448a30038f6fce 100644 --- a/crates/unified/src/server/drill.rs +++ b/crates/unified/src/server/drill.rs @@ -1,7 +1,7 @@ use crate::server::components::PlanetSensor; use crate::prelude::*; use crate::shared::attachment::{PartInShip, Parts}; -use crate::shared::config::planet::Planet; +use crate::shared::config::planet::{Planet, PlanetResource}; use crate::shared::ecs::{Drill, Part, Player, SingleStorage, ToggleDrillEvent, VariableStorage}; pub fn drill_plugin(app: &mut App) { @@ -59,69 +59,41 @@ fn do_drilling( time: Res