diff --git a/src/bin/trees/main.rs b/src/bin/trees/main.rs index b5a6c33..5b2fe78 100644 --- a/src/bin/trees/main.rs +++ b/src/bin/trees/main.rs @@ -31,6 +31,8 @@ fn main() { 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( Update, ( @@ -46,7 +48,7 @@ fn main() { .run_if(on_event::>), spawn_debug_buttons.run_if(on_event::>), handle_plant_tree.run_if(on_event::), - assign_monologue_to_tree.run_if(on_event::), + assign_monologue_to_tree.run_if(on_event::).after(handle_plant_tree), dialog_engine.run_if(on_event::), auto_scroll.run_if(any_component_added::), dialog_box_visibility.run_if(state_changed::), @@ -565,7 +567,7 @@ fn scale_window(events: EventReader, mut window: Single<&mut Wind fn delete_tree(trigger: Trigger>, mut commands: Commands) { if matches!(trigger.event.button, PointerButton::Middle) { - info!("Middle Click -> Despawning {}", trigger.target()); + debug!("Middle Click -> Despawning {}", trigger.target()); commands.entity(trigger.target()).despawn(); } } @@ -658,19 +660,21 @@ fn preview_monologue( } #[derive(Event)] -struct PlantTree; +struct PlantTree(Option>); /// Plan a tree in the world /// Handles random placement, 3d model, materials, and observers fn handle_plant_tree( mut events: EventReader, + mut assignments: EventWriter, trees: Query>, server: Res, mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { - events.read().for_each(|_event| { + events.read().for_each(|PlantTree(assignment)| { + debug!("Planing tree"); let mut tree = commands.spawn(Tree); // Generate "random" X and Y Coordinates for this tree @@ -702,6 +706,13 @@ fn handle_plant_tree( tree.insert((mesh, material, transform)) .observe(delete_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, Without)>, 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| { + debug!("Assigning monologue {:?}", event); + // 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 let monologue = TreeMonologue(event.0.clone()); // Insert the component to the entity commands.entity(tree).insert(monologue); + } else if let Some(path) = event.0.path() { + error!("No trees avaliable for {path:?}"); } else { - error!("No trees avaliable for {:?}", event.0.path().unwrap()); + error!("Monologue is not yet loaded!"); } - }) + }); } fn drag_tree( @@ -828,7 +846,7 @@ fn control_menu( /// Observer for the "Plant a new tree" button in the debug UI fn spawn_tree(_trigger: Trigger>, mut events: EventWriter) { - events.write(PlantTree); + events.write(PlantTree(None)); } fn assign_monologue_event( @@ -839,3 +857,22 @@ fn assign_monologue_event( let TreeMonologue(handle) = monologues.get(trigger.target()).unwrap(); events.write(AssignMonologue(handle.clone())); } + +/// On startup, plant a forest (add a few trees to the game) +fn plant_forest( + monos: Res>, + mut e_trees: EventWriter, +) { + 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; + } +}