~starkingdoms/starkingdoms

2669deac65a56c4f4182ccc45217446ffb8b8e56 — ghostly_zsh 2 hours ago 8bbae28 master
feat: variable storage works in crafting
M crates/unified/assets/config/parts/basic_thruster.part.toml => crates/unified/assets/config/parts/basic_thruster.part.toml +1 -1
@@ 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

M crates/unified/assets/config/recipes.rc.toml => crates/unified/assets/config/recipes.rc.toml +2 -2
@@ 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 } }
]

M crates/unified/src/server/craft.rs => crates/unified/src/server/craft.rs +49 -22
@@ 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);
                        }
                    }
                }
            }
        }