@@ 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 } }
]
@@ 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<Player>>,
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<AssetServer>,
) {
@@ 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);
+ }
+ }
}
}
}