From 2669deac65a56c4f4182ccc45217446ffb8b8e56 Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Sat, 11 Apr 2026 11:43:35 -0500 Subject: [PATCH] feat: variable storage works in crafting --- .../config/parts/basic_thruster.part.toml | 2 +- crates/unified/assets/config/recipes.rc.toml | 4 +- crates/unified/src/server/craft.rs | 71 +++++++++++++------ 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/crates/unified/assets/config/parts/basic_thruster.part.toml b/crates/unified/assets/config/parts/basic_thruster.part.toml index e06a093cdd5d656d8faf285ae7135ae5eb1f0470..4c9c8254f8cbf322d27663f9f66750f0eb82757b 100644 --- a/crates/unified/assets/config/parts/basic_thruster.part.toml +++ b/crates/unified/assets/config/parts/basic_thruster.part.toml @@ -1,5 +1,5 @@ [part] -name = "BasicThruster" +name = "Basic_Thruster" sprite_connected = "textures/cargo_on.png" sprite_disconnected = "textures/cargo_off.png" emissivity = 0.1 diff --git a/crates/unified/assets/config/recipes.rc.toml b/crates/unified/assets/config/recipes.rc.toml index e8e5498943ac14c3f79690081dc6fe3120d4c102..fea01879045160bfcf880aff632fd04933c15056 100644 --- a/crates/unified/assets/config/recipes.rc.toml +++ b/crates/unified/assets/config/recipes.rc.toml @@ -5,12 +5,12 @@ Frame = [ Thruster = [ { order = 1, inputs = { Composite = 30, Hydrogen = 20 } } ] -BasicThruster = [ +Basic_Thruster = [ { order = 2, inputs = { Silicon = 30, Sulfur = 10 } } ] Hub = [ { order = 3, inputs = { Iron = 25, Silicon = 50 } } ] -StorageHub = [ +Storage_Hub = [ { order = 4, inputs = { Composite = 50, Silicon = 50 } } ] diff --git a/crates/unified/src/server/craft.rs b/crates/unified/src/server/craft.rs index 7a57558202f76302dbc6421291303f573611179e..35e34176485ecb09cfaa13cb77583d352af2c567 100644 --- a/crates/unified/src/server/craft.rs +++ b/crates/unified/src/server/craft.rs @@ -1,6 +1,8 @@ use std::collections::HashMap; -use crate::{attachment::{PartInShip, Parts}, ecs::{CraftPartRequest, Part, Player, SingleStorage}, prelude::*, server::part::{SpawnPartBundle, SpawnPartRequest}}; +use good_lp::variable; + +use crate::{attachment::{PartInShip, Parts}, ecs::{CraftPartRequest, Part, Player, SingleStorage, VariableStorage}, prelude::*, server::part::{SpawnPartBundle, SpawnPartRequest}}; pub fn craft_plugin(app: &mut App) { app.add_systems(Update, receive_crafting_request); @@ -11,7 +13,8 @@ fn receive_crafting_request( part_query: Query<(&Transform, &Part, &PartInShip)>, player_query: Query<(Entity, &Transform, &Part), With>, parts_query: Query<&Parts>, - mut storage_query: Query<(&mut SingleStorage)>, + mut single_storage_query: Query<(&mut SingleStorage)>, + mut variable_storage_query: Query<(&mut VariableStorage)>, mut commands: Commands, asset_server: Res, ) { @@ -43,20 +46,32 @@ fn receive_crafting_request( // find total resource in the ship let mut total_resource = HashMap::new(); for part in parts_list.iter() { - let Ok(storage) = storage_query.get_mut(*part) else { - continue; - }; - if let Some(resource) = total_resource.get_mut(&storage.resource_name) { - *resource += storage.stored; - } else { - total_resource.insert(storage.resource_name.clone(), storage.stored); + if let Ok(storage) = single_storage_query.get_mut(*part) { + if let Some(resource) = total_resource.get_mut(&storage.resource_name) { + *resource += storage.stored; + } else { + total_resource.insert(storage.resource_name.clone(), storage.stored); + } + } + if let Ok(storage) = variable_storage_query.get_mut(*part) { + for (name, amount) in &storage.resources { + if let Some(resource) = total_resource.get_mut(name) { + *resource += amount; + } else { + total_resource.insert(name.clone(), *amount); + } + } } } // check if resources in ship are sufficient - for (resource_name, amount) in total_resource { - if let Some(resource) = request.inputs.get(&resource_name) { - if (*resource as f32) > amount { + if total_resource.is_empty() { + // there is no resource of any kind on the ship, so nothing is craftable + continue 'request; + } + for (resource_name, resource) in &request.inputs { + if let Some(amount) = total_resource.get(resource_name) { + if (*resource as f32) > *amount { continue 'request; } } else { @@ -69,16 +84,28 @@ fn receive_crafting_request( // subtract recipe resources from ship let mut inputs = request.inputs.clone(); for part in parts_list.iter() { - let Ok(mut storage) = storage_query.get_mut(*part) else { - continue; - }; - if let Some(resource) = inputs.get_mut(&storage.resource_name) { - if (*resource as f32) > storage.stored { - *resource -= storage.stored as u32; - storage.stored = 0.0; - } else { - storage.stored -= *resource as f32; - inputs.remove(&storage.resource_name); + if let Ok(mut storage) = single_storage_query.get_mut(*part) { + if let Some(resource) = inputs.get_mut(&storage.resource_name) { + if (*resource as f32) > storage.stored { + *resource -= storage.stored as u32; + storage.stored = 0.0; + } else { + storage.stored -= *resource as f32; + inputs.remove(&storage.resource_name); + } + } + } + if let Ok(ref mut storage) = variable_storage_query.get_mut(*part) { + for (resource_name, stored) in &mut storage.resources { + if let Some(resource) = inputs.get_mut(resource_name) { + if (*resource as f32) > *stored { + *resource -= *stored as u32; + *stored = 0.0; + } else { + *stored -= *resource as f32; + inputs.remove(resource_name); + } + } } } }