From f6a4a4cbf42b10fc967ec425dd01205622442e8f Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Tue, 7 Apr 2026 12:32:46 -0500 Subject: [PATCH] feat: crafting removes resources from the ship now --- crates/unified/assets/config/recipes.rc.toml | 2 +- crates/unified/src/client/crafting/ui.rs | 1 - crates/unified/src/server/craft.rs | 76 ++++++++++++++++++-- 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/crates/unified/assets/config/recipes.rc.toml b/crates/unified/assets/config/recipes.rc.toml index 688c0c5f11e401e362fffba47a2b7311282b75e3..8cc3a258ea74169e1a6cf135078b95dc8cf9f373 100644 --- a/crates/unified/assets/config/recipes.rc.toml +++ b/crates/unified/assets/config/recipes.rc.toml @@ -1,6 +1,6 @@ [recipes] Frame = [ - { order = 0, inputs = { Silicon = 10 } } + { order = 0, inputs = { Carbon = 10 } } ] Thruster = [ { order = 1, inputs = { Silicon = 20, Carbon = 20 } } diff --git a/crates/unified/src/client/crafting/ui.rs b/crates/unified/src/client/crafting/ui.rs index d8ce833a0bbc2eb9eafbc441e45538fe9ce4aef0..9ad9cf10efe23a3be0d8ca5c4344dc8b7851e393 100644 --- a/crates/unified/src/client/crafting/ui.rs +++ b/crates/unified/src/client/crafting/ui.rs @@ -254,7 +254,6 @@ fn recipe_buttons( *color = colors::SURFACE_0.into(); if previous_interaction.0 == Interaction::Pressed { // released - debug!("{:?} {} {:?}", recipe.0, recipe.1, recipe.2); crafting_message_writer.write(CraftPartRequest { crafting_part: recipe.0, crafted_part: recipe.1.clone(), diff --git a/crates/unified/src/server/craft.rs b/crates/unified/src/server/craft.rs index 07e220fcd48d59eff1c6b9224d3f65e8f894d480..7a57558202f76302dbc6421291303f573611179e 100644 --- a/crates/unified/src/server/craft.rs +++ b/crates/unified/src/server/craft.rs @@ -1,4 +1,6 @@ -use crate::{ecs::{CraftPartRequest, Part}, prelude::*, server::part::{SpawnPartBundle, SpawnPartRequest}}; +use std::collections::HashMap; + +use crate::{attachment::{PartInShip, Parts}, ecs::{CraftPartRequest, Part, Player, SingleStorage}, prelude::*, server::part::{SpawnPartBundle, SpawnPartRequest}}; pub fn craft_plugin(app: &mut App) { app.add_systems(Update, receive_crafting_request); @@ -6,16 +8,82 @@ pub fn craft_plugin(app: &mut App) { fn receive_crafting_request( mut craft_part_request: MessageReader>, - mut part_query: Query<(&Transform, &Part)>, + part_query: Query<(&Transform, &Part, &PartInShip)>, + player_query: Query<(Entity, &Transform, &Part), With>, + parts_query: Query<&Parts>, + mut storage_query: Query<(&mut SingleStorage)>, mut commands: Commands, asset_server: Res, ) { - for request in craft_part_request.read() { - let Ok((transform, part)) = part_query.get(request.crafting_part) else { + 'request: for request in craft_part_request.read() { + // TODO: make crafting take time + let (transform, part, parts_list) = if let Ok((transform, part, part_in_ship)) = part_query.get(request.crafting_part) { + // this is a normal part + let Ok(parts_list) = parts_query.get(part_in_ship.0) else { + warn!("Couldn't find parts list in part in ship"); + continue; + }; + let parts_list = parts_list.iter().collect::>(); + (transform, part, parts_list) + } else if let Ok((entity, transform, part)) = player_query.get(request.crafting_part) { + // this is a player + let parts_list = if let Ok(parts_list) = parts_query.get(entity) { + let mut parts_list = parts_list.iter().collect::>(); + parts_list.push(entity); + parts_list + } else { + vec![entity] + }; + (transform, part, parts_list) + } else { warn!("When receiving a crafting request, the crafting part didn't exist."); continue; }; + // 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); + } + } + + // 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 { + continue 'request; + } + } else { + // resource doesn't exist in the first place, continue + continue 'request; + } + } + // ok, we have enough resources + + // 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); + } + } + } + + // ok, everything is good! spawn the part commands.spawn(SpawnPartBundle { req: SpawnPartRequest(asset_server.load( format!("config/parts/{}.part.toml", request.crafted_part.to_lowercase()))),