trees get dull when they lose their dialog

main
Elijah Voigt 4 months ago
parent a666beb511
commit 46f35ec3ab

@ -32,15 +32,15 @@ fn main() {
dialog_engine.run_if(on_event::<DialogEvent>),
mouse_wheel_scroll.run_if(on_event::<MouseWheel>),
auto_scroll.run_if(any_component_added::<DialogOption>),
dialog_box_visibility
.run_if(state_changed::<DialogState>),
dialog_box_visibility.run_if(state_changed::<DialogState>),
monologue_asset_tooltip
.run_if(on_event::<Pointer<Over>>
.or(on_event::<Pointer<Out>>)),
.run_if(on_event::<Pointer<Over>>.or(on_event::<Pointer<Out>>)),
),
)
.add_observer(add_dialog_option)
.add_observer(add_dialog_line)
.add_observer(add_tree_monologue)
.add_observer(remove_tree_monologue)
.run();
}
@ -58,72 +58,59 @@ fn init_trees(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
mut ambient_light: ResMut<AmbientLight>,
server: Res<AssetServer>,
) {
let tree_card_mesh = meshes.add(Plane3d::new(Vec3::Y, Vec2::splat(1.0)));
let tree_image = server.load("placeholder/tree.png");
// Global light
{
ambient_light.brightness = 500.0;
}
// Spawn placeholder tree (red)
{
let tree_material_red = materials.add(StandardMaterial {
base_color_texture: Some(tree_image.clone()),
base_color: RED.into(),
alpha_mode: AlphaMode::Blend,
..default()
});
let monologue: Handle<Monologue> = server.load("trees/red.mono");
let tree_transform_red =
Transform::from_xyz(-15.0, 0.0, 15.0).with_scale(Vec3::splat(10.0));
commands.spawn((
Tree,
TreeMonologue(monologue),
Mesh3d(tree_card_mesh.clone()),
MeshMaterial3d(tree_material_red),
tree_transform_red,
Name::new("Red"),
TreeMonologue(server.load("trees/red.mono")),
Mesh3d(meshes.add(Plane3d::new(Vec3::Y, Vec2::splat(1.0)))),
MeshMaterial3d(materials.add(StandardMaterial {
base_color_texture: Some(server.load("placeholder/tree.png")),
base_color: WHITE.into(),
alpha_mode: AlphaMode::Blend,
..default()
})),
Transform::from_xyz(-15.0, 0.0, 15.0).with_scale(Vec3::splat(10.0)),
));
}
// Spawn placeholder tree (green)
{
let tree_material_green = materials.add(StandardMaterial {
base_color_texture: Some(tree_image.clone()),
base_color: GREEN.into(),
alpha_mode: AlphaMode::Blend,
..default()
});
let monologue: Handle<Monologue> = server.load("trees/green.mono");
let tree_transform_green =
Transform::from_xyz(15.0, 0.0, 15.0).with_scale(Vec3::splat(10.0));
commands.spawn((
Tree,
TreeMonologue(monologue),
Mesh3d(tree_card_mesh.clone()),
MeshMaterial3d(tree_material_green),
tree_transform_green,
Name::new("Green"),
TreeMonologue(server.load("trees/green.mono")),
Mesh3d(meshes.add(Plane3d::new(Vec3::Y, Vec2::splat(1.0)))),
MeshMaterial3d(materials.add(StandardMaterial {
base_color_texture: Some(server.load("placeholder/tree.png")),
base_color: WHITE.into(),
alpha_mode: AlphaMode::Blend,
..default()
})),
Transform::from_xyz(15.0, 0.0, 15.0).with_scale(Vec3::splat(10.0)),
));
}
// Spawn placeholder tree (blue)
{
let tree_material_blue = materials.add(StandardMaterial {
base_color_texture: Some(tree_image.clone()),
base_color: BLUE.into(),
alpha_mode: AlphaMode::Blend,
..default()
});
let monologue: Handle<Monologue> = server.load("trees/blue.mono");
let tree_transform_blue =
Transform::from_xyz(0.0, 0.0, -15.0).with_scale(Vec3::splat(10.0));
commands.spawn((
Tree,
TreeMonologue(monologue),
Mesh3d(tree_card_mesh.clone()),
MeshMaterial3d(tree_material_blue),
tree_transform_blue,
Name::new("Blue"),
TreeMonologue(server.load("trees/blue.mono")),
Mesh3d(meshes.add(Plane3d::new(Vec3::Y, Vec2::splat(1.0)))),
MeshMaterial3d(materials.add(StandardMaterial {
base_color_texture: Some(server.load("placeholder/tree.png")),
base_color: WHITE.into(),
alpha_mode: AlphaMode::Blend,
..default()
})),
Transform::from_xyz(0.0, 0.0, -15.0).with_scale(Vec3::splat(10.0)),
));
}
}
@ -252,9 +239,9 @@ fn start_dialog(
query: Query<&TreeMonologue>,
) {
click_events.read().for_each(|event| {
info!("Click event detected");
debug!("Click event detected");
if let Ok(TreeMonologue(handle)) = query.get(event.target) {
info!("Tree Monologue received, sending start dialog event");
debug!("Tree Monologue received, sending start dialog event");
dialog_events.write(DialogEvent::Start(handle.clone()));
dialog_events.write(DialogEvent::NextBatch);
}
@ -268,7 +255,7 @@ fn end_dialog(
query: Query<Entity, Or<(With<TreeMonologue>, With<DialogBox>, With<DialogOption>)>>,
) {
click_events.read().for_each(|event| {
info!("Click even triggered end of dialog: {:?}", event.target);
debug!("Click even triggered end of dialog: {:?}", event.target);
if !query.contains(event.target) {
dialog_events.write(DialogEvent::End);
}
@ -336,11 +323,14 @@ fn dialog_engine(
debug!("Dialog ended");
// Remove the TreeMonologue component from the active tree
monologue_trees.iter().filter_map(|(entity, tree_monologue)| {
(*tree_monologue == TreeMonologue(handle.clone())).then_some(entity)
}).for_each(|e| {
commands.entity(e).remove::<TreeMonologue>();
});
monologue_trees
.iter()
.filter_map(|(entity, tree_monologue)| {
(*tree_monologue == TreeMonologue(handle.clone())).then_some(entity)
})
.for_each(|e| {
commands.entity(e).remove::<TreeMonologue>();
});
// Remove lines from dialog box
lines.iter().for_each(|e| {
@ -466,3 +456,32 @@ fn monologue_asset_tooltip(
}
});
}
fn add_tree_monologue(
trigger: Trigger<OnAdd, TreeMonologue>,
query: Query<&MeshMaterial3d<StandardMaterial>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
// Get the affected entity's MeshMaterial3d
if let Ok(handle) = query.get(trigger.target()) {
// Get the concrete StandardMaterial
if let Some(material) = materials.get_mut(handle) {
material.base_color = WHITE.with_alpha(1.0).into();
}
}
}
fn remove_tree_monologue(
trigger: Trigger<OnRemove, TreeMonologue>,
query: Query<&MeshMaterial3d<StandardMaterial>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
// Get the affected entity's MeshMaterial3d
if let Ok(handle) = query.get(trigger.target()) {
// Get the concrete StandardMaterial
if let Some(material) = materials.get_mut(handle) {
// Make it dull
material.base_color = WHITE.with_alpha(0.9).into();
}
}
}

@ -61,7 +61,7 @@ impl AssetLoader for MonologueLoader {
.filter(|sub: &Vec<String>| !sub.is_empty())
.collect();
info!("Monologue: {:#?}", value);
debug!("Monologue: {:#?}", value);
let thing = Monologue { value };
Ok(thing)

@ -1,6 +1,7 @@
use bevy::{
color::palettes::css::MAGENTA,
pbr::wireframe::{WireframeConfig, WireframePlugin}, platform::collections::HashMap,
pbr::wireframe::{WireframeConfig, WireframePlugin},
platform::collections::HashMap,
};
use super::*;
@ -31,7 +32,8 @@ impl Plugin for DebuggingPlugin {
.run_if(state_changed::<DebuggingState>),
toggle_debug_state.run_if(on_keyboard_press(KeyCode::F12)),
(
(hover_mesh, hover_ui).run_if(on_event::<Pointer<Over>>.or(on_event::<Pointer<Out>>)),
(hover_mesh, hover_ui)
.run_if(on_event::<Pointer<Over>>.or(on_event::<Pointer<Out>>)),
tooltip_follow.run_if(any_component_changed::<Window>),
sync_resource_to_ui::<ToolTip>.run_if(resource_changed::<ToolTip>),
)
@ -167,7 +169,7 @@ fn hover_mesh(
let pos = (t.translation.x, t.translation.y, t.translation.z);
let name = match n {
Some(x) => x,
None => "???",
None => "N/A",
};
tooltip.insert("ID", format!("{e}"));
tooltip.insert("Pos", format!("{pos:.3?}"));
@ -198,7 +200,7 @@ fn hover_ui(
if let Ok(n) = nodes.get(e) {
let name = match n {
Some(x) => x,
None => "???",
None => "N/A",
};
tooltip.insert("ID", format!("{e}"));
tooltip.insert("Name", name.into());

Loading…
Cancel
Save