5 Commits

Author SHA1 Message Date
ea9055e46c (autoformat) 2025-08-30 09:24:38 -05:00
be9cb3fe69 Fix: pass the machine ID through, not PLACEHOLDER
Oops. Yay for rushed work.
2025-08-30 09:23:59 -05:00
6fb3539329 Use hook on FuelGauge to show text on first spawn
There is an on-add hook that can be used to maintain invariants. I'll
use it to ensure the label text always gets the current fuel value upon
spawning the widget, regardless of whether or not the caller remembers
to set it up themselves.
2025-08-30 09:21:57 -05:00
fb8a27325e Add machine components to the other dummies 2025-08-29 10:08:13 -05:00
4a80b4f4ad Make Fuel a required component on machines
It will be pulled in automatically by Bevy, now. I've also set a default
fuel level of 5 units.
2025-08-29 09:55:16 -05:00
4 changed files with 44 additions and 9 deletions

View File

@@ -16,16 +16,22 @@ pub mod machines {
use bevy::prelude::*;
use crate::game::consumables::Fuel;
#[derive(Component)]
#[require(Fuel)]
pub struct CuttingMachine;
#[derive(Component)]
#[require(Fuel)]
pub struct RotatingMachine;
#[derive(Component)]
#[require(Fuel)]
pub struct FlippingMachine;
#[derive(Component)]
#[require(Fuel)]
pub struct TransposingMachine;
}
@@ -35,6 +41,11 @@ pub mod consumables {
#[derive(Component)]
pub struct Fuel(pub u32);
impl Default for Fuel {
fn default() -> Self {
Self(5)
}
}
#[derive(Event)]
pub struct FuelChanged;
}

View File

@@ -2,10 +2,7 @@ use bevy::{color::palettes::css::*, prelude::*, window::WindowResolution};
use bevy_inspector_egui::{bevy_egui::EguiPlugin, quick::WorldInspectorPlugin};
use crate::{
game::{
consumables::Fuel,
machines::{CuttingMachine, FlippingMachine, RotatingMachine, TransposingMachine},
},
game::machines::{CuttingMachine, FlippingMachine, RotatingMachine, TransposingMachine},
resources::UiTheme,
widgets::SpawnUi,
};
@@ -50,7 +47,6 @@ fn dummy_machines(mut commands: Commands) {
commands
.spawn((
CuttingMachine,
Fuel(10),
Sprite::from_color(RED, Vec2::splat(40.0)),
Transform::from_translation(Vec3::new(-40.0, 40.0, 0.0)),
Pickable::default(),
@@ -59,6 +55,7 @@ fn dummy_machines(mut commands: Commands) {
commands
.spawn((
RotatingMachine,
Sprite::from_color(GREEN, Vec2::splat(40.0)),
Transform::from_translation(Vec3::new(40.0, 40.0, 0.0)),
Pickable::default(),
@@ -68,6 +65,7 @@ fn dummy_machines(mut commands: Commands) {
// TODO: The other observers, once they have a spawner struct & impl.
commands
.spawn((
FlippingMachine,
Sprite::from_color(PURPLE, Vec2::splat(40.)),
Transform::from_translation(Vec3::new(-40.0, -40.0, 0.0)),
Pickable::default(),
@@ -76,6 +74,7 @@ fn dummy_machines(mut commands: Commands) {
commands
.spawn((
TransposingMachine,
Sprite::from_color(DARK_ORANGE, Vec2::splat(40.)),
Transform::from_translation(Vec3::new(40.0, -40.0, 0.0)),
Pickable::default(),

View File

@@ -1,9 +1,15 @@
use bevy::{color::palettes::css::*, prelude::*, ui::Val::*};
use bevy::{
color::palettes::css::*,
ecs::{component::HookContext, world::DeferredWorld},
prelude::*,
ui::Val::*,
};
use crate::game::consumables::{Fuel, FuelChanged};
#[derive(Component)]
#[require(Label)]
#[component(on_add = FuelGauge::refresh_label)]
pub struct FuelGauge(Entity);
impl FuelGauge {
@@ -41,4 +47,23 @@ impl FuelGauge {
);
label.0 = format!("Fuel: {}", fuel.0);
}
fn refresh_label(mut world: DeferredWorld, ctx: HookContext) {
// Get the machine ID from the FuelGauge component.
let Some(machine_id) = world.get::<FuelGauge>(ctx.entity).map(|fg| fg.0) else {
panic!("Couldn't get a FuelGauge during it's on-add hook run!");
};
// and fuel level
let Some(fuel) = world.get::<Fuel>(machine_id).map(|lvl| lvl.0) else {
// TODO: Maybe don't panic and just emit a warning.
panic!("Couldn't get a Fuel for a machine during a FuelGauge on-add hook.");
};
// Get an excl ref to the Text component so we can redraw its text
let Some(mut label) = world.get_mut::<Text>(ctx.entity) else {
panic!()
};
label.0 = format!("Fuel: {}", fuel);
}
}

View File

@@ -52,7 +52,7 @@ impl SpawnUi for RotatingMachine {
fn spawn_ui(mut commands: Commands, theme: Res<UiTheme>, machine_id: Entity) {
let base_entity = machine_ui_base(&mut commands, "Rotating Machine", &theme);
commands.entity(base_entity).with_children(|commands| {
commands.spawn(FuelGauge::bundle(Entity::PLACEHOLDER));
commands.spawn(FuelGauge::bundle(machine_id));
// Center panel (placeholder for input-output rotation)
commands.spawn((
@@ -87,7 +87,7 @@ impl SpawnUi for FlippingMachine {
fn spawn_ui(mut commands: Commands, theme: Res<UiTheme>, machine_id: Entity) {
let base_entity = machine_ui_base(&mut commands, "Flipping Machine", &theme);
commands.entity(base_entity).with_children(|commands| {
commands.spawn(FuelGauge::bundle(Entity::PLACEHOLDER));
commands.spawn(FuelGauge::bundle(machine_id));
// Center panel (placeholder)
commands.spawn((
@@ -122,7 +122,7 @@ impl SpawnUi for TransposingMachine {
fn spawn_ui(mut commands: Commands, theme: Res<UiTheme>, machine_id: Entity) {
let base_entity = machine_ui_base(&mut commands, "Transposing Machine", &theme);
commands.entity(base_entity).with_children(|commands| {
commands.spawn(FuelGauge::bundle(Entity::PLACEHOLDER));
commands.spawn(FuelGauge::bundle(machine_id));
// Center panel (placeholder)
commands.spawn((