Spawning 10 trees at startup works

main
Elijah Voigt 3 months ago
parent 4f1c634ed2
commit 5e246d21dc

@ -31,6 +31,8 @@ fn main() {
position_camera.after(setup_camera), position_camera.after(setup_camera),
), ),
) )
// When we're done loading, plant forest
.add_systems(OnEnter(LoadingState::Idle), plant_forest.run_if(run_once))
.add_systems( .add_systems(
Update, Update,
( (
@ -46,7 +48,7 @@ fn main() {
.run_if(on_event::<Pointer<Click>>), .run_if(on_event::<Pointer<Click>>),
spawn_debug_buttons.run_if(on_event::<AssetEvent<Monologue>>), spawn_debug_buttons.run_if(on_event::<AssetEvent<Monologue>>),
handle_plant_tree.run_if(on_event::<PlantTree>), handle_plant_tree.run_if(on_event::<PlantTree>),
assign_monologue_to_tree.run_if(on_event::<AssignMonologue>), assign_monologue_to_tree.run_if(on_event::<AssignMonologue>).after(handle_plant_tree),
dialog_engine.run_if(on_event::<DialogEvent>), dialog_engine.run_if(on_event::<DialogEvent>),
auto_scroll.run_if(any_component_added::<DialogOption>), auto_scroll.run_if(any_component_added::<DialogOption>),
dialog_box_visibility.run_if(state_changed::<DialogState>), dialog_box_visibility.run_if(state_changed::<DialogState>),
@ -565,7 +567,7 @@ fn scale_window(events: EventReader<WindowResized>, mut window: Single<&mut Wind
fn delete_tree(trigger: Trigger<Pointer<Click>>, mut commands: Commands) { fn delete_tree(trigger: Trigger<Pointer<Click>>, mut commands: Commands) {
if matches!(trigger.event.button, PointerButton::Middle) { if matches!(trigger.event.button, PointerButton::Middle) {
info!("Middle Click -> Despawning {}", trigger.target()); debug!("Middle Click -> Despawning {}", trigger.target());
commands.entity(trigger.target()).despawn(); commands.entity(trigger.target()).despawn();
} }
} }
@ -658,19 +660,21 @@ fn preview_monologue(
} }
#[derive(Event)] #[derive(Event)]
struct PlantTree; struct PlantTree(Option<Handle<Monologue>>);
/// Plan a tree in the world /// Plan a tree in the world
/// Handles random placement, 3d model, materials, and observers /// Handles random placement, 3d model, materials, and observers
fn handle_plant_tree( fn handle_plant_tree(
mut events: EventReader<PlantTree>, mut events: EventReader<PlantTree>,
mut assignments: EventWriter<AssignMonologue>,
trees: Query<Entity, With<Tree>>, trees: Query<Entity, With<Tree>>,
server: Res<AssetServer>, server: Res<AssetServer>,
mut commands: Commands, mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>, mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>, mut materials: ResMut<Assets<StandardMaterial>>,
) { ) {
events.read().for_each(|_event| { events.read().for_each(|PlantTree(assignment)| {
debug!("Planing tree");
let mut tree = commands.spawn(Tree); let mut tree = commands.spawn(Tree);
// Generate "random" X and Y Coordinates for this tree // Generate "random" X and Y Coordinates for this tree
@ -702,6 +706,13 @@ fn handle_plant_tree(
tree.insert((mesh, material, transform)) tree.insert((mesh, material, transform))
.observe(delete_tree) .observe(delete_tree)
.observe(drag_tree); .observe(drag_tree);
match assignment {
Some(handle) => {
assignments.write(AssignMonologue(handle.clone()));
}
None => ()
}
}); });
} }
@ -714,17 +725,24 @@ fn assign_monologue_to_tree(
query: Query<Entity, (With<Tree>, Without<TreeMonologue>)>, query: Query<Entity, (With<Tree>, Without<TreeMonologue>)>,
mut commands: Commands, mut commands: Commands,
) { ) {
// Kinda a weird hack because query does not update
// If we do this inline we assign new monologues to the same first tree
let mut t = query.iter();
events.read().for_each(|event| { events.read().for_each(|event| {
debug!("Assigning monologue {:?}", event);
// Get a valid tree to assign an entity to // Get a valid tree to assign an entity to
if let Some(tree) = query.iter().next() { if let Some(tree) = t.next() {
// Create the TreeMonologue component // Create the TreeMonologue component
let monologue = TreeMonologue(event.0.clone()); let monologue = TreeMonologue(event.0.clone());
// Insert the component to the entity // Insert the component to the entity
commands.entity(tree).insert(monologue); commands.entity(tree).insert(monologue);
} else if let Some(path) = event.0.path() {
error!("No trees avaliable for {path:?}");
} else { } else {
error!("No trees avaliable for {:?}", event.0.path().unwrap()); error!("Monologue is not yet loaded!");
} }
}) });
} }
fn drag_tree( fn drag_tree(
@ -828,7 +846,7 @@ fn control_menu(
/// Observer for the "Plant a new tree" button in the debug UI /// Observer for the "Plant a new tree" button in the debug UI
fn spawn_tree(_trigger: Trigger<Pointer<Click>>, mut events: EventWriter<PlantTree>) { fn spawn_tree(_trigger: Trigger<Pointer<Click>>, mut events: EventWriter<PlantTree>) {
events.write(PlantTree); events.write(PlantTree(None));
} }
fn assign_monologue_event( fn assign_monologue_event(
@ -839,3 +857,22 @@ fn assign_monologue_event(
let TreeMonologue(handle) = monologues.get(trigger.target()).unwrap(); let TreeMonologue(handle) = monologues.get(trigger.target()).unwrap();
events.write(AssignMonologue(handle.clone())); events.write(AssignMonologue(handle.clone()));
} }
/// On startup, plant a forest (add a few trees to the game)
fn plant_forest(
monos: Res<Assets<Monologue>>,
mut e_trees: EventWriter<PlantTree>,
) {
let mut i = 10;
for id in monos.ids() {
debug!("Planting tree with monologue {:?}", id);
if i > 5 {
e_trees.write(PlantTree(Some(Handle::Weak(id))));
} else if i > 0 {
e_trees.write(PlantTree(None));
} else {
break
}
i -= 1;
}
}

Loading…
Cancel
Save