From befaa917c10b84bfd035b0830e7f1675bac75299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Sat, 16 Mar 2024 13:18:56 +0100 Subject: [PATCH 1/2] use seeded random for alien cake addict --- examples/games/alien_cake_addict.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/games/alien_cake_addict.rs b/examples/games/alien_cake_addict.rs index 8c8847b78f2b0..cd933d38ffabb 100644 --- a/examples/games/alien_cake_addict.rs +++ b/examples/games/alien_cake_addict.rs @@ -3,7 +3,7 @@ use std::f32::consts::PI; use bevy::prelude::*; -use rand::Rng; +use rand::{rngs::StdRng, Rng, SeedableRng}; #[derive(Clone, Eq, PartialEq, Debug, Hash, Default, States)] enum GameState { @@ -81,6 +81,9 @@ struct Game { camera_is_focus: Vec3, } +#[derive(Resource, Deref, DerefMut)] +struct SeededRng(StdRng); + const BOARD_SIZE_I: usize = 14; const BOARD_SIZE_J: usize = 21; @@ -105,6 +108,8 @@ fn setup_cameras(mut commands: Commands, mut game: ResMut) { } fn setup(mut commands: Commands, asset_server: Res, mut game: ResMut) { + let mut seeded_rng = StdRng::seed_from_u64(19878367467713); + // reset the game state game.cake_eaten = 0; game.score = 0; @@ -129,7 +134,7 @@ fn setup(mut commands: Commands, asset_server: Res, mut game: ResMu .map(|j| { (0..BOARD_SIZE_I) .map(|i| { - let height = rand::thread_rng().gen_range(-0.1..0.1); + let height = seeded_rng.gen_range(-0.1..0.1); commands.spawn(SceneBundle { transform: Transform::from_xyz(i as f32, height - 0.2, j as f32), scene: cell_scene.clone(), @@ -180,6 +185,8 @@ fn setup(mut commands: Commands, asset_server: Res, mut game: ResMu ..default() }), ); + + commands.insert_resource(SeededRng(seeded_rng)); } // remove all entities that are not a camera or window @@ -305,6 +312,7 @@ fn spawn_bonus( mut next_state: ResMut>, mut commands: Commands, mut game: ResMut, + mut rng: ResMut, ) { // make sure we wait enough time before spawning the next cake if !timer.0.tick(time.delta()).finished() { @@ -323,8 +331,8 @@ fn spawn_bonus( // ensure bonus doesn't spawn on the player loop { - game.bonus.i = rand::thread_rng().gen_range(0..BOARD_SIZE_I); - game.bonus.j = rand::thread_rng().gen_range(0..BOARD_SIZE_J); + game.bonus.i = rng.gen_range(0..BOARD_SIZE_I); + game.bonus.j = rng.gen_range(0..BOARD_SIZE_J); if game.bonus.i != game.player.i || game.bonus.j != game.player.j { break; } From 4b594d031216b8cb2ff3979a1359ae48e9a4032d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Sun, 17 Mar 2024 00:53:19 +0100 Subject: [PATCH 2/2] only in CI Co-Authored-By: Rob Parrett --- examples/games/alien_cake_addict.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/examples/games/alien_cake_addict.rs b/examples/games/alien_cake_addict.rs index cd933d38ffabb..a1571310fb533 100644 --- a/examples/games/alien_cake_addict.rs +++ b/examples/games/alien_cake_addict.rs @@ -82,7 +82,7 @@ struct Game { } #[derive(Resource, Deref, DerefMut)] -struct SeededRng(StdRng); +struct Random(StdRng); const BOARD_SIZE_I: usize = 14; const BOARD_SIZE_J: usize = 21; @@ -108,7 +108,12 @@ fn setup_cameras(mut commands: Commands, mut game: ResMut) { } fn setup(mut commands: Commands, asset_server: Res, mut game: ResMut) { - let mut seeded_rng = StdRng::seed_from_u64(19878367467713); + let mut rng = if std::env::var("GITHUB_ACTIONS") == Ok("true".to_string()) { + // Make the game play out the same way every time, this is useful for testing purposes. + StdRng::seed_from_u64(19878367467713) + } else { + StdRng::from_entropy() + }; // reset the game state game.cake_eaten = 0; @@ -134,7 +139,7 @@ fn setup(mut commands: Commands, asset_server: Res, mut game: ResMu .map(|j| { (0..BOARD_SIZE_I) .map(|i| { - let height = seeded_rng.gen_range(-0.1..0.1); + let height = rng.gen_range(-0.1..0.1); commands.spawn(SceneBundle { transform: Transform::from_xyz(i as f32, height - 0.2, j as f32), scene: cell_scene.clone(), @@ -186,7 +191,7 @@ fn setup(mut commands: Commands, asset_server: Res, mut game: ResMu }), ); - commands.insert_resource(SeededRng(seeded_rng)); + commands.insert_resource(Random(rng)); } // remove all entities that are not a camera or window @@ -312,7 +317,7 @@ fn spawn_bonus( mut next_state: ResMut>, mut commands: Commands, mut game: ResMut, - mut rng: ResMut, + mut rng: ResMut, ) { // make sure we wait enough time before spawning the next cake if !timer.0.tick(time.delta()).finished() {