~starkingdoms/starkingdoms

44af5cad10ff206a7aa471b48821d764afefcba0 — ghostly_zsh 7 hours ago 53cdaab master
feat: drill does drill, and there's a resource display
M crates/unified/assets/config/planets.pc.toml => crates/unified/assets/config/planets.pc.toml +1 -0
@@ 28,6 28,7 @@ sprite = "textures/earth.png"
indicator_sprite = "textures/earth_icon.png"
radius = 2000.0 # m
mass = 16_900_000_000.0 # kg
planet_resource = { name = "Carbon", color = { LinearRgba = { red = 1.0, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 2.0 }
default_transform = [300_000.0, 0.0, 0.0]
orbit = { orbiting = "Sun", eccentricity = 0.0167 }


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

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

pub fn crafting_ui_plugin(app: &mut App) {
    app.add_systems(Update, (close_button, drill_button, drill_state_change));
    app.add_systems(Update, (close_button, drill_button, drill_state_change, single_storage_display));
}

#[derive(Component)]


@@ 12,17 12,18 @@ struct CloseButton(Entity); // stores corresponding menu entity
struct PreviousInteraction(Interaction);
#[derive(Component)]
struct DrillButton(Entity); // stores corresponding part
#[derive(Component)]
struct SingleStorageDisplay(Entity); // stores corresponding part

pub fn open_crafting_ui(
    ev: On<Pointer<Press>>,
    crafting_parts: Query<(Entity, &Transform), (With<PartInShip>, With<CanCraft>)>,
    hearty: Query<(Entity, &Transform), (With<Me>, With<CanCraft>)>,
    crafting_parts: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>), (With<PartInShip>, With<CanCraft>)>,
    hearty: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>), (With<Me>, With<CanCraft>)>,
    camera: Single<(Entity, &Camera, &GlobalTransform), (With<MainCamera>, Without<PartInShip>)>,
    commands: Commands,
    drills: Query<&Drill>,
) {
    if matches!(ev.button, PointerButton::Secondary) {
        let (entity, transform) = if let Ok(part) = crafting_parts.get(ev.entity) {
        let (entity, transform, drill, single_storage) = if let Ok(part) = crafting_parts.get(ev.entity) {
            part
        } else if let Ok(part) = hearty.get(ev.entity) {
            part


@@ 31,7 32,7 @@ pub fn open_crafting_ui(
        };
        // we have our crafting entity!
        // now make the ui
        setup_ui(entity, transform, commands, camera, drills);
        setup_ui(entity, transform, commands, camera, drill, single_storage);
    }
}



@@ 40,7 41,8 @@ fn setup_ui(
    parent_transform: &Transform,
    mut commands: Commands,
    camera: Single<(Entity, &Camera, &GlobalTransform), (With<MainCamera>, Without<PartInShip>)>,
    drills: Query<&Drill>,
    drill: Option<&Drill>,
    single_storage: Option<&SingleStorage>,
) {
    let parent_pos = camera.1.world_to_viewport(camera.2, parent_transform.translation).unwrap();
    let entity = commands.spawn((


@@ 83,7 85,7 @@ fn setup_ui(
            ));
        });
        // only add the drill button if the part is a drill
        if let Ok(drill) = drills.get(parent_part) {
        if let Some(drill) = drill {
            parent.spawn((
                Node {
                    width: Val::Px(100.0),


@@ 109,6 111,20 @@ fn setup_ui(
                ));
            });
        }
        // only add storage if the part has single storage
        if let Some(single_storage) = single_storage {
            parent.spawn((
                Node {
                    ..Default::default()
                },
                TextFont {
                    font_size: 10.0,
                    ..Default::default()
                },
                Text::new(format!("{}: {}", single_storage.resource_name, single_storage.stored)),
                SingleStorageDisplay(parent_part),
            ));
        }
    });
}



@@ 187,6 203,15 @@ fn get_drill_text(drill: &Drill) -> String {
        "Drill not on planet".to_string()
    }
}
fn single_storage_display(
    mut single_storage_display_query: Query<(&mut Text, &SingleStorageDisplay)>,
    part_query: Query<&SingleStorage, With<Part>>,
) {
    for (mut text, single_storage_display) in &mut single_storage_display_query {
        let single_storage = part_query.get(single_storage_display.0).expect("In single_storage_display, the entity didn't match a storage.");
        **text = format!("{}: {}", single_storage.resource_name, single_storage.stored);
    }
}

fn close_button(
    mut commands: Commands,

M crates/unified/src/server/drill.rs => crates/unified/src/server/drill.rs +51 -1
@@ 1,4 1,4 @@
use crate::{attachment::{PartInShip, Parts}, config::planet::Planet, ecs::{Drill, Part, PlanetSensor, SingleStorage, ToggleDrillEvent}, prelude::*};
use crate::{attachment::{PartInShip, Parts}, config::planet::Planet, ecs::{Drill, Part, PlanetSensor, Player, SingleStorage, ToggleDrillEvent}, prelude::*};

pub fn drill_plugin(app: &mut App) {
    app.add_systems(Update, (toggle_drill, drill_on_planet, do_drilling));


@@ 47,12 47,62 @@ fn drill_on_planet(

fn do_drilling(
    drills: Query<(&Drill, &PartInShip)>,
    hearty_drills: Query<(Entity, &Drill), With<Player>>,
    parts_query: Query<&Parts>,
    mut storage_part_query: Query<&mut SingleStorage, With<Part>>,
    planet_query: Query<&Planet>,
    time: Res<Time>,
) {
    for (entity, drill) in hearty_drills {
        if !drill.drilling || drill.on_planet.is_none() {
            continue
        }
        let planet_name = drill.on_planet.clone().unwrap();
        let mut planet = None;
        for q_planet in planet_query {
            if q_planet.name == planet_name {
                planet = Some(q_planet);
                break;
            }
        }
        // if the planet name doesn't match a planet, we have a big problem
        let planet = planet.expect("In do_drilling, a planet name didn't match a planet");
        let Some(ref planet_resource) = planet.planet_resource else {
            continue
        };
        'adding_resources: {
            if let Ok(parts_list) = parts_query.get(entity) {
                for part_entity in parts_list.iter() {
                    let Ok(mut storage) = storage_part_query.get_mut(part_entity) else {
                        continue
                    };
                    if storage.resource_name.is_empty() {
                        storage.resource_name = planet_resource.name.clone();
                    }
                    // now that the name isn't empty, this will trigger
                    if storage.resource_name == planet_resource.name {
                        storage.stored += planet_resource.mining_speed * drill.resource_multiplier * time.delta_secs();
                        storage.stored = storage.stored.min(storage.capacity);
                        break 'adding_resources;
                    }
                }
            }
            let Ok(mut storage) = storage_part_query.get_mut(entity) else {
                break 'adding_resources;
            };
            if storage.resource_name.is_empty() {
                storage.resource_name = planet_resource.name.clone();
            }
            // now that the name isn't empty, this will trigger
            if storage.resource_name == planet_resource.name {
                storage.stored += planet_resource.mining_speed * drill.resource_multiplier * time.delta_secs();
                storage.stored = storage.stored.min(storage.capacity);
                break 'adding_resources;
            }
        };
    }
    for (drill, part_in_ship) in drills {
        debug!("drill");
        if !drill.drilling || drill.on_planet.is_none() {
            continue
        }

M crates/unified/src/server/player/join.rs => crates/unified/src/server/player/join.rs +5 -3
@@ 1,3 1,4 @@
use crate::attachment::PartInShip;
use crate::config::planet::Planet;
use crate::config::world::GlobalWorldConfig;
use crate::ecs::{Hi, Player, PlayerStorage};


@@ 32,9 33,10 @@ fn join_player(joined_player: Entity, mut commands: Commands, wc: &GlobalWorldCo

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

    commands
        .entity(joined_player)
        .insert(new_transform)
    let mut entity = commands
        .entity(joined_player);
    let id = entity.id();
    entity.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 -1
@@ 1,6 1,6 @@
use crate::attachment::{Joint, JointOf, PartInShip, Peer, Ship, SnapOf, SnapOfJoint};
use crate::config::planet::{Planet, PlanetConfigCollection};
use crate::ecs::{CanCraft, DragRequestEvent, Drill, Hi, Part, Particles, Player, PlayerStorage, Temperature, ToggleDrillEvent};
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;
use crate::prelude::*;


@@ 56,6 56,7 @@ pub fn register_everything(app: &mut App) {
    app.replicate::<CanCraft>();
    app.replicate::<Temperature>();
    app.replicate::<Drill>();
    app.replicate::<SingleStorage>();
}

fn physics_setup_plugin(app: &mut App) {