~starkingdoms/starkingdoms

0e2da454f0202d5aea3a98143811bcc00467f405 — ghostly_zsh 4 hours ago 44af5ca
feat: recipe list config + basis for ui
M crates/unified/Cargo.toml => crates/unified/Cargo.toml +1 -0
@@ 27,6 27,7 @@ bevy = { version = "0.18", default-features = false, features = [
    "default_font",
    "png",
    "bevy_gizmos",
    "bevy_gizmos_render",
    "bevy_post_process",
    "bevy_anti_alias",
    "bevy_sprite_render",

A crates/unified/assets/config/recipes.rc.toml => crates/unified/assets/config/recipes.rc.toml +7 -0
@@ 0,0 1,7 @@
[recipes]
Frame = [
    { Silicon = 10 }
]
Thruster = [
    { Silicon = 20, Carbon = 20 }
]

M crates/unified/src/client/crafting/ui.rs => crates/unified/src/client/crafting/ui.rs +56 -1
@@ 1,8 1,11 @@
use bevy::{input_focus::{AutoFocus, InputFocus}, ui::RelativeCursorPosition};

use crate::{attachment::PartInShip, client::colors, ecs::{CanCraft, CraftingUi, Drill, MainCamera, Me, Part, SingleStorage, ToggleDrillEvent}, prelude::*};
use crate::{attachment::PartInShip, client::colors, config::recipe::RecipesConfig, ecs::{CanCraft, CraftingUi, Drill, MainCamera, Me, Part, SingleStorage, ToggleDrillEvent}, prelude::*};

pub fn crafting_ui_plugin(app: &mut App) {
    app.init_resource::<RecipeCollection>();
    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));
}



@@ 14,6 17,18 @@ struct PreviousInteraction(Interaction);
struct DrillButton(Entity); // stores corresponding part
#[derive(Component)]
struct SingleStorageDisplay(Entity); // stores corresponding part
#[derive(Component)]
struct RecipesHolder;
#[derive(Component)]
struct PendingRecipesHolder;
#[derive(Resource, Default)]
struct RecipeCollection {
    handle: Option<Handle<RecipesConfig>>,
}

fn load_recipes(asset_server: Res<AssetServer>, mut recipe_collection: ResMut<RecipeCollection>) {
    recipe_collection.handle = Some(asset_server.load("config/recipes.rc.toml"));
}

pub fn open_crafting_ui(
    ev: On<Pointer<Press>>,


@@ 125,9 140,49 @@ fn setup_ui(
                SingleStorageDisplay(parent_part),
            ));
        }
        // assume CanCraft for now (THIS WILL CHANGE)
        parent.spawn((
            Node {
                ..Default::default()
            },
            PendingRecipesHolder,
        ));
    });
}

fn initial_create_recipe_list(
    mut commands: Commands,
    added_recipes_holders: Query<Entity, With<PendingRecipesHolder>>,
    recipe_collection: ResMut<RecipeCollection>,
    recipes_config: Res<Assets<RecipesConfig>>,
) {
    if let Some(strong_recipes_config) = recipes_config.get(&recipe_collection.handle.clone().unwrap()) {
        for recipe_holder in &added_recipes_holders {
            let mut recipe_holder = commands.get_entity(recipe_holder).unwrap();
            debug!("{:?}", strong_recipes_config);
            recipe_holder
                .insert(RecipesHolder)
                .remove::<PendingRecipesHolder>();
        }
    }
}
fn update_recipe_list(
    mut ev_config: MessageReader<AssetEvent<RecipesConfig>>,
    recipe_collection: ResMut<RecipeCollection>,
) {
    let Some(handle) = recipe_collection.handle.as_ref() else {
        return
    };

    for ev in ev_config.read() {
        if let AssetEvent::Modified { id } = ev {
            if *id == handle.id() {
                debug!("recipe list config modified - reloading lists");
            }
        }
    }
}

fn drill_button(
    mut interaction_query: Query<
        (

M crates/unified/src/config/mod.rs => crates/unified/src/config/mod.rs +1 -0
@@ 1,3 1,4 @@
pub mod part;
pub mod planet;
pub mod world;
pub mod recipe;

A crates/unified/src/config/recipe.rs => crates/unified/src/config/recipe.rs +16 -0
@@ 0,0 1,16 @@
use std::collections::HashMap;

use serde::{Deserialize, Serialize};

use crate::prelude::*;

#[derive(Deserialize, Asset, TypePath, Component, Serialize, Clone, Debug)]
#[require(Replicated)]
pub struct RecipesConfig {
    pub recipes: HashMap<String, Vec<HashMap<String, u32>>>,
}

/*#[derive(Deserialize, TypePath, Component, Serialize, Clone, Debug)]
pub struct Recipe {
    pub inputs: HashMap<String, u32>,
}*/

M crates/unified/src/ecs.rs => crates/unified/src/ecs.rs +1 -0
@@ 113,6 113,7 @@ pub struct Hi {
}

#[derive(Component, Serialize, Deserialize, Debug)]
#[require(Replicated)]
pub struct CanCraft;
#[derive(Component, Serialize, Deserialize, Debug)]
pub struct CraftingUi;

M crates/unified/src/server/player/join.rs => crates/unified/src/server/player/join.rs +3 -4
@@ 33,10 33,9 @@ fn join_player(joined_player: Entity, mut commands: Commands, wc: &GlobalWorldCo

    info!(?new_transform, ?joined_player, "set player's position!");

    let mut entity = commands
        .entity(joined_player);
    let id = entity.id();
    entity.insert(new_transform)
    commands
        .entity(joined_player)
        .insert(new_transform)
        .insert(SpawnPartRequest(
            asset_server.load("config/parts/hearty.part.toml"),
        ))

M crates/unified/src/shared_plugins.rs => crates/unified/src/shared_plugins.rs +2 -0
@@ 1,5 1,6 @@
use crate::attachment::{Joint, JointOf, PartInShip, Peer, Ship, SnapOf, SnapOfJoint};
use crate::config::planet::{Planet, PlanetConfigCollection};
use crate::config::recipe::RecipesConfig;
use crate::ecs::{CanCraft, DragRequestEvent, Drill, Hi, Part, Particles, Player, PlayerStorage, SingleStorage, Temperature, ToggleDrillEvent};
use bevy::app::{App, PluginGroup, PluginGroupBuilder};
use bevy_common_assets::toml::TomlAssetPlugin;


@@ 28,6 29,7 @@ impl PluginGroup for SharedPluginGroup {
            .add(TomlAssetPlugin::<GlobalWorldConfig>::new(&["wc.toml"]))
            .add(TomlAssetPlugin::<PlanetConfigCollection>::new(&["pc.toml"]))
            .add(TomlAssetPlugin::<PartConfig>::new(&["part.toml"]))
            .add(TomlAssetPlugin::<RecipesConfig>::new(&["rc.toml"]))
    }
}