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"]))
}
}