From 8bbae28ef02dcef8ae19715d43d6b05edb8829ec Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Sat, 11 Apr 2026 09:28:26 -0500 Subject: [PATCH] feat: variable storage on hearty appears to store things correctly --- .../assets/config/parts/hearty.part.toml | 2 +- crates/unified/src/client/crafting/ui.rs | 43 +++++++++-- crates/unified/src/ecs.rs | 6 ++ crates/unified/src/server/drill.rs | 75 +++++++++++-------- crates/unified/src/server/part.rs | 24 ++++-- 5 files changed, 105 insertions(+), 45 deletions(-) diff --git a/crates/unified/assets/config/parts/hearty.part.toml b/crates/unified/assets/config/parts/hearty.part.toml index 31d9c39e4f7640f18ab38bfcbc83ae9c350b2f9c..3f13f33008ca24a85a53078cf0bb08004821a008 100644 --- a/crates/unified/assets/config/parts/hearty.part.toml +++ b/crates/unified/assets/config/parts/hearty.part.toml @@ -71,5 +71,5 @@ can_craft = true resource_multiplier = 1.0 [storage] -storage_type = "SingleResource" +storage_type = "MultipleResources" capacity = 300.0 diff --git a/crates/unified/src/client/crafting/ui.rs b/crates/unified/src/client/crafting/ui.rs index 9ad9cf10efe23a3be0d8ca5c4344dc8b7851e393..3b0754e41f2c5cc085dd37ed86bd420460b4d0ec 100644 --- a/crates/unified/src/client/crafting/ui.rs +++ b/crates/unified/src/client/crafting/ui.rs @@ -2,14 +2,14 @@ use std::collections::HashMap; use bevy::{input_focus::{AutoFocus, InputFocus}, ui::RelativeCursorPosition}; -use crate::{attachment::PartInShip, client::colors, config::recipe::RecipesConfig, ecs::{CanCraft, CraftPartRequest, CraftingUi, Drill, MainCamera, Me, Part, SingleStorage, ToggleDrillEvent}, prelude::*}; +use crate::{attachment::PartInShip, client::colors, config::recipe::RecipesConfig, ecs::{CanCraft, CraftPartRequest, CraftingUi, Drill, MainCamera, Me, Part, SingleStorage, ToggleDrillEvent, VariableStorage}, prelude::*}; pub fn crafting_ui_plugin(app: &mut App) { app.init_resource::(); app.add_systems(Startup, load_recipes); app.add_systems(PreUpdate, (initial_create_recipe_list, update_recipe_list)); app.add_systems(Update, (close_button, drill_button, drill_state_change, - single_storage_display, recipe_buttons)); + single_storage_display, variable_storage_display, recipe_buttons)); } #[derive(Component)] @@ -21,6 +21,8 @@ struct DrillButton(Entity); // stores corresponding part #[derive(Component)] struct SingleStorageDisplay(Entity); // stores corresponding part #[derive(Component)] +struct VariableStorageDisplay(Entity); // stores corresponding part +#[derive(Component)] struct RecipesHolder(Entity); // stores corresponding part #[derive(Component)] struct PendingRecipesHolder(Entity); // stores corresponding part @@ -38,13 +40,13 @@ fn load_recipes(asset_server: Res, mut recipe_collection: ResMut>, - crafting_parts: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>), (With, With)>, - hearty: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>), (With, With)>, + crafting_parts: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>, Option<&VariableStorage>), (With, With)>, + hearty: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>, Option<&VariableStorage>), (With, With)>, camera: Single<(Entity, &Camera, &GlobalTransform), (With, Without)>, commands: Commands, ) { if matches!(ev.button, PointerButton::Secondary) { - let (entity, transform, drill, single_storage) = if let Ok(part) = crafting_parts.get(ev.entity) { + let (entity, transform, drill, single_storage, variable_storage) = if let Ok(part) = crafting_parts.get(ev.entity) { part } else if let Ok(part) = hearty.get(ev.entity) { part @@ -53,7 +55,8 @@ pub fn open_crafting_ui( }; // we have our crafting entity! // now make the ui - setup_ui(entity, transform, commands, camera, drill, single_storage); + setup_ui(entity, transform, commands, camera, drill, single_storage, + variable_storage); } } @@ -64,6 +67,7 @@ fn setup_ui( camera: Single<(Entity, &Camera, &GlobalTransform), (With, Without)>, drill: Option<&Drill>, single_storage: Option<&SingleStorage>, + variable_storage: Option<&VariableStorage>, ) { let parent_pos = camera.1.world_to_viewport(camera.2, parent_transform.translation).unwrap(); let entity = commands.spawn(( @@ -146,6 +150,20 @@ fn setup_ui( SingleStorageDisplay(parent_part), )); } + // only add storage if the part has variable storage + if let Some(variable_storage) = variable_storage { + parent.spawn(( + Node { + ..Default::default() + }, + TextFont { + font_size: 10.0, + ..Default::default() + }, + Text::new(get_variable_storage_display_text(&variable_storage)), + VariableStorageDisplay(parent_part), + )); + } // assume CanCraft for now (THIS WILL CHANGE) parent.spawn(( Node { @@ -353,6 +371,19 @@ fn single_storage_display( **text = format!("{}: {}", single_storage.resource_name, single_storage.stored); } } +fn variable_storage_display( + mut variable_storage_display_query: Query<(&mut Text, &VariableStorageDisplay)>, + part_query: Query<&VariableStorage, With>, +) { + for (mut text, variable_storage_display) in &mut variable_storage_display_query { + let variable_storage = part_query.get(variable_storage_display.0).expect("In variable_storage_display, the entity didn't match a storage."); + **text = get_variable_storage_display_text(&variable_storage); + } +} +fn get_variable_storage_display_text(storage: &VariableStorage) -> String { + storage.resources.iter().map(|(name, amount)| format!("{}: {}", name, amount)) + .collect::>().join("\n") +} fn close_button( mut commands: Commands, diff --git a/crates/unified/src/ecs.rs b/crates/unified/src/ecs.rs index 40ee0af877be6b2628e9199d7331832f15615f69..8abb2bcaaf7386b930bc2d8c116acac0803be962 100644 --- a/crates/unified/src/ecs.rs +++ b/crates/unified/src/ecs.rs @@ -162,3 +162,9 @@ pub struct SingleStorage { pub capacity: f32, pub stored: f32, } +#[derive(Component, Serialize, Deserialize, Debug)] +#[require(Replicated)] +pub struct VariableStorage { + pub resources: HashMap, + pub capacity: f32, +} diff --git a/crates/unified/src/server/drill.rs b/crates/unified/src/server/drill.rs index 90b5cb4d708d91fe4b47060fc8c8d6cfdde21904..372f415edce399c0cc7fede438e0d59ba98a2c9c 100644 --- a/crates/unified/src/server/drill.rs +++ b/crates/unified/src/server/drill.rs @@ -1,4 +1,4 @@ -use crate::{attachment::{PartInShip, Parts}, config::planet::Planet, ecs::{Drill, Part, PlanetSensor, Player, SingleStorage, ToggleDrillEvent}, prelude::*}; +use crate::{attachment::{PartInShip, Parts}, config::planet::Planet, ecs::{Drill, Part, PlanetSensor, Player, SingleStorage, ToggleDrillEvent, VariableStorage}, prelude::*}; pub fn drill_plugin(app: &mut App) { app.add_systems(Update, (toggle_drill, drill_on_planet, do_drilling)); @@ -49,7 +49,8 @@ fn do_drilling( drills: Query<(&Drill, &PartInShip)>, hearty_drills: Query<(Entity, &Drill), With>, parts_query: Query<&Parts>, - mut storage_part_query: Query<&mut SingleStorage, With>, + mut single_storage_part_query: Query<&mut SingleStorage, With>, + mut variable_storage_part_query: Query<&mut VariableStorage, With>, planet_query: Query<&Planet>, time: Res