|
|
|
|
@ -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::<Pointer<Click>>),
|
|
|
|
|
spawn_debug_buttons.run_if(on_event::<AssetEvent<Monologue>>),
|
|
|
|
|
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>),
|
|
|
|
|
auto_scroll.run_if(any_component_added::<DialogOption>),
|
|
|
|
|
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) {
|
|
|
|
|
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<Handle<Monologue>>);
|
|
|
|
|
|
|
|
|
|
/// Plan a tree in the world
|
|
|
|
|
/// Handles random placement, 3d model, materials, and observers
|
|
|
|
|
fn handle_plant_tree(
|
|
|
|
|
mut events: EventReader<PlantTree>,
|
|
|
|
|
mut assignments: EventWriter<AssignMonologue>,
|
|
|
|
|
trees: Query<Entity, With<Tree>>,
|
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
|
mut commands: Commands,
|
|
|
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
// 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<Entity, (With<Tree>, Without<TreeMonologue>)>,
|
|
|
|
|
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<Pointer<Click>>, mut events: EventWriter<PlantTree>) {
|
|
|
|
|
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<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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|