Make Seed a component

Conceptually it works better as a resource, but that's an extra layer of complexity for the upcoming automatic distribution work.
This commit is contained in:
Michael Bradley 2025-07-06 17:47:19 -04:00
parent 9ab8db41de
commit d89d539f3b
Signed by: MichaelBradley
SSH key fingerprint: SHA256:o/aaeYtRubILK7OYYjYP12DmU7BsPUhKji1AgaQ+ge4
5 changed files with 15 additions and 29 deletions

View file

@ -2,17 +2,9 @@ use bevy::prelude::*;
use crate::net::prelude::*; use crate::net::prelude::*;
use super::seed::Seed; pub fn handle_new_peer(new_peers: Query<&Peer, Added<Peer>>) {
for peer in new_peers {
pub fn handle_new_peer( info!("Peer {} was added", peer.uuid);
seed: Option<Res<Seed>>,
new_peers: Query<&Peer, Added<Peer>>,
mut outbound: EventWriter<OutboundPacket>,
) {
if let Some(seed) = seed {
for peer in new_peers {
outbound.write(OutboundPacket(Packet::new((*seed).into(), peer.uuid)));
}
} }
} }
@ -27,12 +19,8 @@ pub fn handle_deleted_peer(mut old_peers: RemovedComponents<Peer>, peers: Query<
Ok(()) Ok(())
} }
pub fn handle_incoming_packets(mut packets: EventReader<InboundPacket>, mut commands: Commands) { pub fn handle_incoming_packets(mut packets: EventReader<InboundPacket>) {
for packet in packets.read() { for packet in packets.read() {
if let Ok(seed) = packet.0.message.clone().try_into() { info!("Packet received: {:?}", packet.0.message);
commands.insert_resource::<Seed>(seed);
} else {
info!("Packet not seed: {:?}", packet.0.message);
}
} }
} }

View file

@ -96,10 +96,10 @@ impl Plugin for GamePlugin {
info!("Will retrieve seed from peer => {peer}"); info!("Will retrieve seed from peer => {peer}");
} }
DataSource::Seed(seed) => { DataSource::Seed(seed) => {
app.insert_resource(seed); app.world_mut().spawn(seed);
} }
DataSource::None => { DataSource::None => {
app.insert_resource(Seed::random()); app.world_mut().spawn(Seed::random());
} }
}; };
} }

View file

@ -7,7 +7,7 @@ use bevy::prelude::*;
use rand::random; use rand::random;
/// Value with which to initialize the PRNG /// Value with which to initialize the PRNG
#[derive(Resource, Debug, Clone, Copy)] #[derive(Clone, Component, Copy, Debug)]
pub struct Seed(u64); pub struct Seed(u64);
impl Seed { impl Seed {

View file

@ -23,7 +23,7 @@ const BALL_COUNT: u8 = 32;
const BALL_SIZES: Range<f32> = 10.0..25.0; const BALL_SIZES: Range<f32> = 10.0..25.0;
const DIMENSION_SIZES: Range<f32> = 500.0..2000.0; const DIMENSION_SIZES: Range<f32> = 500.0..2000.0;
pub fn check_for_seed(seed: Option<Res<Seed>>, mut next_state: ResMut<NextState<AppState>>) { pub fn check_for_seed(seed: Option<Single<&Seed>>, mut next_state: ResMut<NextState<AppState>>) {
if seed.is_some() { if seed.is_some() {
next_state.set(AppState::InGame); next_state.set(AppState::InGame);
} }
@ -34,8 +34,8 @@ pub fn check_for_seed(seed: Option<Res<Seed>>, mut next_state: ResMut<NextState<
pub struct PlayableArea(f32, f32); pub struct PlayableArea(f32, f32);
/// Initialize deterministic values /// Initialize deterministic values
pub fn setup_from_seed(mut commands: Commands, seed: Res<Seed>) { pub fn setup_from_seed(mut commands: Commands, seed: Single<&Seed>) {
let mut rng = WyRand::from_seed((*seed).into()); let mut rng = WyRand::from_seed((**seed).into());
commands.insert_resource(PlayableArea( commands.insert_resource(PlayableArea(
rng.random_range(DIMENSION_SIZES), rng.random_range(DIMENSION_SIZES),
rng.random_range(DIMENSION_SIZES), rng.random_range(DIMENSION_SIZES),

View file

@ -21,13 +21,11 @@ pub fn setup_seed_ui(mut commands: Commands) {
.with_child((TextSpan::new("<N/A>"), SeedUI)); .with_child((TextSpan::new("<N/A>"), SeedUI));
} }
pub fn update_seed_ui(seed: Option<Res<Seed>>, text: Query<&mut TextSpan, With<SeedUI>>) { pub fn update_seed_ui(seed: Option<Single<&Seed>>, text: Query<&mut TextSpan, With<SeedUI>>) {
if let Some(value) = seed { if let Some(value) = seed {
if value.is_changed() { for mut span in text {
for mut span in text { let number: u64 = (**value).into();
let number: u64 = (*value).into(); **span = format!("{}", number);
**span = format!("{}", number);
}
} }
} }
} }