k4d3 commited on
Commit
7cbc376
1 Parent(s): d3be795

some changes

Browse files
Cargo.toml CHANGED
@@ -14,6 +14,9 @@ license = "MIT"
14
  keywords = ["gamedev"]
15
  publish = false
16
 
 
 
 
17
  [[bin]]
18
  name = "separated"
19
  path = "src/app/main.rs"
@@ -73,7 +76,7 @@ dev_features = [
73
  "bevy/trace",
74
  "bevy/file_watcher",
75
  "bevy/embedded_watcher",
76
- #"bevy_progress/debug",
77
  "bevy_rapier2d/debug-render-2d",
78
  #"big-brain/trace",
79
  #"sickle_ui/dev",
@@ -105,22 +108,22 @@ leafwing-input-manager = { git = "https://github.com/ka-de/input-manager", branc
105
  ] }
106
  # ⚠️ TODO: Use the `sys-locale` crate instead, also maybe figure out how to query Steamworks later!
107
  # cargo add sys-locale
108
- #bevy_device_lang = { git = "https://github.com/ka-de/bevy_device_lang", branch = "0.14" }
109
- #aery = { git = "https://github.com/ka-de/aery", branch = "0.14" }
110
- #bevy_vector_shapes = { git = "https://github.com/ka-de/bevy_vector_shapes", branch = "0.14" }
111
- #big-brain = { git = "https://github.com/ka-de/big-brain" }
112
  bevy_mod_debugdump = { git = "https://github.com/ka-de/bevy_mod_debugdump", optional = true }
113
  graphviz-rust = { version = "0.9.0", optional = true }
114
  seldom_state = { git = "https://github.com/ka-de/seldom_state" }
115
- # bevy_text_input = { git = "https://github.com/ka-de/bevy_text_input", branch = "0.14" }
116
- # bevy_flurx = { git = "https://github.com/ka-de/bevy_flurx", branch = "0.14" }
117
- # bevy_magic_light_2d = { git = "https://github.com/ka-de/bevy_magic_light_2d", branch = "0.14" }
118
- #bevy_incandescent = { git = "https://github.com/ka-de/bevy_incandescent", branch = "0.14", features = [
119
  # "debug",
120
  # "ray_marching",
121
  #] }
122
  #bevy_reflect_utils = { git = "https://github.com/ka-de/bevy_reflect_utils" }
123
- bevy_mod_aseprite = { git = "https://github.com/ka-de/bevy_mod_aseprite" }
 
124
  # This gets rid of the excessive logging from wgpu clogging my trace performance.
125
  log = { version = "0.4.22", features = [
126
  "max_level_debug",
@@ -162,14 +165,13 @@ features = [
162
  "sysinfo_plugin", # ⚠️ OwO whats this?
163
  ]
164
 
165
- # ☠️ RIP?
166
- #[dependencies.bevy_asset_loader]
167
- #git = "https://github.com/ka-de/bevy_asset_loader"
168
- #branch = "0.14"
169
- #default-features = false
170
- #features = ["2d", "standard_dynamic_assets", "progress_tracking"]
171
 
172
  [dependencies.bevy_ecs_ldtk]
 
173
  git = "https://github.com/ka-de/bevy_ecs_ldtk"
174
  branch = "0.14"
175
 
@@ -182,11 +184,10 @@ features = ["highlight_changes"]
182
  #[dependencies.bevy_tweening]
183
  #git = "https://github.com/ka-de/bevy_tweening"
184
 
185
- #[dependencies.bevy_progress]
186
- #git = "https://github.com/ka-de/bevy_progress"
187
- #branch = "0.14"
188
- #features = ["assets"]
189
- #default-features = false
190
 
191
  #[dependencies.bevy-steamworks]
192
  #git = "https://github.com/ka-de/bevy_steamworks"
 
14
  keywords = ["gamedev"]
15
  publish = false
16
 
17
+ [lib]
18
+ path = "src/lib.rs"
19
+
20
  [[bin]]
21
  name = "separated"
22
  path = "src/app/main.rs"
 
76
  "bevy/trace",
77
  "bevy/file_watcher",
78
  "bevy/embedded_watcher",
79
+ #"iyes_progress/debug",
80
  "bevy_rapier2d/debug-render-2d",
81
  #"big-brain/trace",
82
  #"sickle_ui/dev",
 
108
  ] }
109
  # ⚠️ TODO: Use the `sys-locale` crate instead, also maybe figure out how to query Steamworks later!
110
  # cargo add sys-locale
111
+ aery = { git = "https://github.com/ka-de/aery" }
112
+ #bevy_vector_shapes = { git = "https://github.com/ka-de/bevy_vector_shapes" }
113
+ big-brain = { git = "https://github.com/ka-de/big-brain" }
 
114
  bevy_mod_debugdump = { git = "https://github.com/ka-de/bevy_mod_debugdump", optional = true }
115
  graphviz-rust = { version = "0.9.0", optional = true }
116
  seldom_state = { git = "https://github.com/ka-de/seldom_state" }
117
+ bevy_simple_text_input = { git = "https://github.com/ka-de/bevy_text_input" }
118
+ # bevy_flurx = { git = "https://github.com/ka-de/bevy_flurx" }
119
+ # bevy_magic_light_2d = { git = "https://github.com/ka-de/bevy_magic_light_2d" }
120
+ #bevy_incandescent = { git = "https://github.com/ka-de/bevy_incandescent", features = [
121
  # "debug",
122
  # "ray_marching",
123
  #] }
124
  #bevy_reflect_utils = { git = "https://github.com/ka-de/bevy_reflect_utils" }
125
+ # ⚠️ TODO: No 0.14 update yet!
126
+ #bevy_mod_aseprite = { git = "https://github.com/ka-de/bevy_mod_aseprite" }
127
  # This gets rid of the excessive logging from wgpu clogging my trace performance.
128
  log = { version = "0.4.22", features = [
129
  "max_level_debug",
 
165
  "sysinfo_plugin", # ⚠️ OwO whats this?
166
  ]
167
 
168
+ [dependencies.bevy_asset_loader]
169
+ git = "https://github.com/ka-de/bevy_asset_loader"
170
+ default-features = false
171
+ features = ["2d", "standard_dynamic_assets", "progress_tracking"]
 
 
172
 
173
  [dependencies.bevy_ecs_ldtk]
174
+ #git = "https://github.com/Trouv/bevy_ecs_ldtk"
175
  git = "https://github.com/ka-de/bevy_ecs_ldtk"
176
  branch = "0.14"
177
 
 
184
  #[dependencies.bevy_tweening]
185
  #git = "https://github.com/ka-de/bevy_tweening"
186
 
187
+ [dependencies.iyes_progress]
188
+ git = "https://github.com/ka-de/iyes_progress"
189
+ features = ["assets"]
190
+ default-features = false
 
191
 
192
  #[dependencies.bevy-steamworks]
193
  #git = "https://github.com/ka-de/bevy_steamworks"
README.md CHANGED
@@ -229,7 +229,7 @@ This command generates documentation for the package with all features enabled,
229
  // `input-manager` handles the input.
230
 
231
  use bevy::prelude::*;
232
- use input_manager::{ axislike::VirtualAxis, prelude::* };
233
  use seldom_state::prelude::*;
234
 
235
  fn main() {
 
229
  // `input-manager` handles the input.
230
 
231
  use bevy::prelude::*;
232
+ use leafwing_input_manager::{ axislike::VirtualAxis, prelude::* };
233
  use seldom_state::prelude::*;
234
 
235
  fn main() {
assets/dialogues/definitions.yarn DELETED
@@ -1,9 +0,0 @@
1
- ===
2
- //==================================================================================//
3
- // Definitions
4
- //==================================================================================//
5
- // - Rubicon
6
- // ---
7
- // The phrase “crossing the Rubicon” is an idiom that means “passing a point of no return”. Its meaning comes from an event in early January 49 BC when Julius Caesar crossed the Rubicon river, which was considered an act of war. This act sparked a three-year civil war that ultimately left Julius Caesar the undisputed ruler of the Roman world.
8
- // In a broader sense, “Rubicon” is used to refer to a limit or point that, once crossed, commits a person irrevocably to a particular course of action. It's often used to signify a point of no return or a critical decision point.
9
- // In Games: In some games, a “rubicon” is an act of winning a game against an opponent whose total score is less than 100, in which case the loser's score is added to rather than subtracted from the winner's.
 
 
 
 
 
 
 
 
 
 
assets/dialogues/the_treachery.yarn ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ title: The_Treachery
2
+ position: 276,-65
3
+ ---
4
+ Player: Why did you cross the Rubicon?
5
+ Morgath: Only the council knew of the treachery and someone had to be blamed..
6
+ Morgath: The choice was between you, and another child.
7
+ Morgath: After the meeting, I went to seek the elder's wisdom..
8
+ Morgath: He told me that the answers I was seeking was hidden in the dark forest.
9
+ Morgath: I didn't know what to do. I had no intention of going back to the forest, I was scared and in my haste I chose to blame you and cast your family into the exile.
10
+ Player: Okay, but why go on this journey all those years later?
11
+ Morgath: I don't know... I don't know!
12
+ Morgath: It got to me, all this time, only me keeping this dark secret alive while everyone else went on with their life, even you, look at you in your fancy armor!
13
+ ===
14
+ title: Node
15
+ position: 280,162
16
+ ---
17
+ Asd: It's nice to see you again, <Player>! I just wish it were under better circumstances!
18
+ -> Indeed, this was not the right way for a reunion, but it is still a welcome one!
19
+ ===
src/app/main.rs CHANGED
@@ -1,3 +1,5 @@
 
 
1
  // Turn clippy into a real bitch
2
  #![warn(clippy::all, clippy::pedantic)]
3
 
@@ -15,10 +17,10 @@ use bevy_rand::prelude::{ WyRand, EntropyPlugin, GlobalEntropy };
15
 
16
  use plugins::gamestate::GameState;
17
 
18
- mod components;
19
- mod systems;
20
- mod entities;
21
- mod plugins;
22
 
23
  //use bevy_tweening::*;
24
 
@@ -56,10 +58,10 @@ use bevy_incandescent::{
56
  //use bevy_hanabi::prelude::*;
57
 
58
  // ⚠️ TODO: Move this with Game Settings
59
- use components::settings::GameSettings;
60
 
61
- use crate::plugins::ui::set_window_icon::set_window_icon;
62
- use crate::plugins::get_backend::get_backend;
63
  // ⚠️ TODO: Move audio stuff to its own thing
64
 
65
  // 🎲 - Random Number Generation
@@ -125,20 +127,20 @@ fn main() {
125
  ..default()
126
  })
127
  .set(ImagePlugin::default_nearest())
128
- .set(plugins::debug::make_log_plugin()),
129
  //TweeningPlugin,
130
- plugins::gamestate::game_state_plugin,
131
- systems::setup_world_systems,
132
- plugins::dialogueview::YarnSpinnerDialogueViewPlugin {
133
  loading_state: GameState::SplashScreen,
134
  playing_state: GameState::Playing,
135
  },
136
- plugins::input::InputPlugin,
137
- plugins::ui::plugin,
138
- plugins::audio::plugin,
139
- plugins::pathfinding::plugin,
140
- bevy_mod_aseprite::AsepritePlugin,
141
  StateMachinePlugin,
 
142
  //IncandescentPlugin,
143
  //HanabiPlugin,
144
  ))
@@ -147,12 +149,12 @@ fn main() {
147
  .add_systems(Startup, set_window_icon) // Set the Window icon.
148
  // ⚠️ TODO: A proper system that saves this value and allows the player to change it.
149
  // Requires start of working on localization and saving and loading settings.
150
- .add_systems(Startup, get_device_language) // Get the device language.
151
 
152
  //.add_systems(Startup, print_random_value)
153
 
154
  // Debug plugin comes last, allowing to inspect the final app state.
155
- .add_plugins(plugins::debug::plugin);
156
 
157
  // Actually start the game now!
158
  app.run();
 
1
+ use separated;
2
+
3
  // Turn clippy into a real bitch
4
  #![warn(clippy::all, clippy::pedantic)]
5
 
 
17
 
18
  use plugins::gamestate::GameState;
19
 
20
+ use separated::plugins::gamestate::GameState;
21
+ use separated::components::settings::GameSettings;
22
+ use separated::plugins::ui::set_window_icon::set_window_icon;
23
+ use separated::plugins::get_backend::get_backend;
24
 
25
  //use bevy_tweening::*;
26
 
 
58
  //use bevy_hanabi::prelude::*;
59
 
60
  // ⚠️ TODO: Move this with Game Settings
61
+ use separated::components::settings::GameSettings;
62
 
63
+ use separated::plugins::ui::set_window_icon::set_window_icon;
64
+ use separated::plugins::get_backend::get_backend;
65
  // ⚠️ TODO: Move audio stuff to its own thing
66
 
67
  // 🎲 - Random Number Generation
 
127
  ..default()
128
  })
129
  .set(ImagePlugin::default_nearest())
130
+ .set(separated::plugins::debug::make_log_plugin()),
131
  //TweeningPlugin,
132
+ separated::plugins::gamestate::game_state_plugin,
133
+ separated::systems::setup_world_systems,
134
+ separated::plugins::dialogueview::YarnSpinnerDialogueViewPlugin {
135
  loading_state: GameState::SplashScreen,
136
  playing_state: GameState::Playing,
137
  },
138
+ separated::plugins::input::InputPlugin,
139
+ separated::plugins::ui::plugin,
140
+ separated::plugins::audio::plugin,
141
+ separated::plugins::pathfinding::plugin,
 
142
  StateMachinePlugin,
143
+ bevy_mod_aseprite::AsepritePlugin,
144
  //IncandescentPlugin,
145
  //HanabiPlugin,
146
  ))
 
149
  .add_systems(Startup, set_window_icon) // Set the Window icon.
150
  // ⚠️ TODO: A proper system that saves this value and allows the player to change it.
151
  // Requires start of working on localization and saving and loading settings.
152
+ //.add_systems(Startup, get_device_language) // Get the device language.
153
 
154
  //.add_systems(Startup, print_random_value)
155
 
156
  // Debug plugin comes last, allowing to inspect the final app state.
157
+ .add_plugins(separated::plugins::debug::plugin);
158
 
159
  // Actually start the game now!
160
  app.run();
src/lib.rs ADDED
@@ -0,0 +1 @@
 
 
1
+ pub mod plugins;
src/plugins/debug.rs CHANGED
@@ -1,23 +1,22 @@
1
  /// this code is compiled only if debug assertions are enabled (debug mode)
2
-
3
- use graphviz_rust::{ cmd::{ CommandArg, Format }, exec_dot };
4
-
5
  use bevy::{
6
- prelude::*,
7
  utils::intern::Interned,
8
- ecs::schedule::ScheduleLabel,
9
- input::common_conditions::input_toggle_active,
10
  };
11
  use bevy_inspector_egui::quick::WorldInspectorPlugin;
12
- use bevy_rapier2d::{ prelude::RapierDebugRenderPlugin, render::DebugRenderContext };
13
 
14
- use super::{ gamestate::GameState, ui::fps_widget::{ spawn_fps_widget, FpsWidget } };
 
 
 
15
  use crate::components::childof::debug_children;
16
 
17
  // Adds L key as debug KeyCode for toggling physics wireframes.
18
  pub fn toggle_physics_wireframes(
19
  mut ctx: ResMut<DebugRenderContext>,
20
- input: Res<ButtonInput<KeyCode>>
21
  ) {
22
  if input.just_pressed(KeyCode::F9) {
23
  ctx.enabled = !ctx.enabled;
@@ -38,41 +37,52 @@ pub(crate) fn plugin(app: &mut App) {
38
  // RapierDebugRenderPlugin
39
  RapierDebugRenderPlugin::default(),
40
  // StateInspectorPlugin
41
- bevy_inspector_egui::quick::StateInspectorPlugin::<GameState>
42
- ::default()
43
- .run_if(bevy::input::common_conditions::input_toggle_active(false, KeyCode::F10)),
44
  ));
45
 
46
  // Startup
47
- app.add_systems(Startup, (
48
- // Debug all parent and child elements with the Name component.
49
- debug_children,
50
- // Disable wireframes by default. I've seen enough collision boxes for now.
51
- disable_physics_wireframes,
52
- ));
 
 
 
53
 
54
  // Update
55
  // FpsWidget
56
- app.add_systems(Update, spawn_fps_widget.run_if(not(any_with_component::<FpsWidget>)));
 
 
 
57
  // DebugRenderContext - Rapier
58
  app.add_systems(Update, toggle_physics_wireframes);
59
 
 
60
  if let Err(err) = render_graphs(app) {
61
  error!("Error rendering graph: {}", err);
62
  }
 
63
  }
64
 
65
  pub(crate) fn make_log_plugin() -> impl Plugin {
66
  bevy::log::LogPlugin {
67
  level: bevy::log::Level::DEBUG,
68
- filter: "info,big_brain=debug,one_off=debug,separated=debug,wgpu_core=warn,wgpu_hal=warn".into(),
 
69
  update_subscriber: None,
70
  }
71
  }
72
 
 
73
  type IoResult = std::io::Result<()>;
74
 
75
  /// ⚠️ debugdump 🐛 render system and render graphs when the RENDER_GRAPHS environment variable is set
 
76
  fn render_graphs(app: &mut App) -> IoResult {
77
  if std::env::var_os("RENDER_GRAPHS") == None {
78
  return Ok(());
@@ -128,3 +138,4 @@ pub fn render_graph(graph_str: String, output_stem: impl AsRef<str>) -> std::io:
128
  )?;
129
  Ok(())
130
  }
 
 
1
  /// this code is compiled only if debug assertions are enabled (debug mode)
2
+ //use graphviz_rust::{ cmd::{ CommandArg, Format }, exec_dot };
 
 
3
  use bevy::{
4
+ ecs::schedule::ScheduleLabel, input::common_conditions::input_toggle_active, prelude::*,
5
  utils::intern::Interned,
 
 
6
  };
7
  use bevy_inspector_egui::quick::WorldInspectorPlugin;
8
+ use bevy_rapier2d::{prelude::RapierDebugRenderPlugin, render::DebugRenderContext};
9
 
10
+ use super::{
11
+ gamestate::GameState,
12
+ ui::fps_widget::{spawn_fps_widget, FpsWidget},
13
+ };
14
  use crate::components::childof::debug_children;
15
 
16
  // Adds L key as debug KeyCode for toggling physics wireframes.
17
  pub fn toggle_physics_wireframes(
18
  mut ctx: ResMut<DebugRenderContext>,
19
+ input: Res<ButtonInput<KeyCode>>,
20
  ) {
21
  if input.just_pressed(KeyCode::F9) {
22
  ctx.enabled = !ctx.enabled;
 
37
  // RapierDebugRenderPlugin
38
  RapierDebugRenderPlugin::default(),
39
  // StateInspectorPlugin
40
+ bevy_inspector_egui::quick::StateInspectorPlugin::<GameState>::default().run_if(
41
+ bevy::input::common_conditions::input_toggle_active(false, KeyCode::F10),
42
+ ),
43
  ));
44
 
45
  // Startup
46
+ app.add_systems(
47
+ Startup,
48
+ (
49
+ // Debug all parent and child elements with the Name component.
50
+ debug_children,
51
+ // Disable wireframes by default. I've seen enough collision boxes for now.
52
+ disable_physics_wireframes,
53
+ ),
54
+ );
55
 
56
  // Update
57
  // FpsWidget
58
+ app.add_systems(
59
+ Update,
60
+ spawn_fps_widget.run_if(not(any_with_component::<FpsWidget>)),
61
+ );
62
  // DebugRenderContext - Rapier
63
  app.add_systems(Update, toggle_physics_wireframes);
64
 
65
+ /*
66
  if let Err(err) = render_graphs(app) {
67
  error!("Error rendering graph: {}", err);
68
  }
69
+ */
70
  }
71
 
72
  pub(crate) fn make_log_plugin() -> impl Plugin {
73
  bevy::log::LogPlugin {
74
  level: bevy::log::Level::DEBUG,
75
+ filter: "info,big_brain=debug,one_off=debug,separated=debug,wgpu_core=warn,wgpu_hal=warn"
76
+ .into(),
77
  update_subscriber: None,
78
  }
79
  }
80
 
81
+ /*
82
  type IoResult = std::io::Result<()>;
83
 
84
  /// ⚠️ debugdump 🐛 render system and render graphs when the RENDER_GRAPHS environment variable is set
85
+
86
  fn render_graphs(app: &mut App) -> IoResult {
87
  if std::env::var_os("RENDER_GRAPHS") == None {
88
  return Ok(());
 
138
  )?;
139
  Ok(())
140
  }
141
+ */
src/plugins/gamestate.rs CHANGED
@@ -10,7 +10,7 @@ use bevy_asset_loader::{
10
  loading_state::{ LoadingState, LoadingStateAppExt },
11
  standard_dynamic_asset::StandardDynamicAsset,
12
  };
13
- use bevy_progress::ProgressPlugin;
14
 
15
  use crate::plugins::splashscreen::{ SplashScreenConfiguration, SplashScreenPlugin };
16
 
 
10
  loading_state::{ LoadingState, LoadingStateAppExt },
11
  standard_dynamic_asset::StandardDynamicAsset,
12
  };
13
+ use iyes_progress::ProgressPlugin;
14
 
15
  use crate::plugins::splashscreen::{ SplashScreenConfiguration, SplashScreenPlugin };
16
 
src/plugins/input.rs CHANGED
@@ -14,14 +14,14 @@ use bevy::{
14
  utils::default,
15
  };
16
  use bevy_rapier2d::dynamics::Velocity;
17
- use input_manager::{
18
  input_map::InputMap,
19
  action_state::{ ActionData, ActionState },
20
  axislike::VirtualDPad,
21
  input_processing::WithDualAxisProcessingPipelineExt,
22
  plugin::{ InputManagerPlugin, InputManagerSystem },
23
  };
24
- pub use input_manager::Actionlike;
25
 
26
  use std::collections::HashMap;
27
  use std::time::Instant;
 
14
  utils::default,
15
  };
16
  use bevy_rapier2d::dynamics::Velocity;
17
+ use leafwing_input_manager::{
18
  input_map::InputMap,
19
  action_state::{ ActionData, ActionState },
20
  axislike::VirtualDPad,
21
  input_processing::WithDualAxisProcessingPipelineExt,
22
  plugin::{ InputManagerPlugin, InputManagerSystem },
23
  };
24
+ pub use leafwing_input_manager::Actionlike;
25
 
26
  use std::collections::HashMap;
27
  use std::time::Instant;
src/plugins/splashscreen/mod.rs CHANGED
@@ -12,7 +12,7 @@ use bevy_asset_loader::loading_state::{
12
  LoadingState,
13
  LoadingStateAppExt,
14
  };
15
- use bevy_progress::ProgressPlugin;
16
  pub use resources::SplashScreenConfiguration;
17
 
18
  use self::{
 
12
  LoadingState,
13
  LoadingStateAppExt,
14
  };
15
+ use iyes_progress::ProgressPlugin;
16
  pub use resources::SplashScreenConfiguration;
17
 
18
  use self::{
src/plugins/ui/mod.rs CHANGED
@@ -1,9 +1,8 @@
1
  use bevy::prelude::*;
2
 
 
3
  use release_label::release_label;
4
  use tooltip::spawn_tooltip;
5
- use bevy_vector_shapes::prelude::*;
6
- use aery::prelude::*;
7
 
8
  //use keycap_demo::keycap_demo;
9
 
@@ -35,16 +34,11 @@ use crate::plugins::ui::keycap_demo::keycap_demo;
35
  pub(crate) fn plugin(app: &mut bevy::app::App) {
36
  // Resources
37
  app.insert_resource(ClearColor(Color::DARK_GRAY))
38
- // Plugins
39
- .add_plugins(ShapePlugin::default())
40
- // 🐺
41
  // Startup
42
  //.add_systems(Startup, keycap_demo)
43
  .add_systems(Startup, release_label)
44
-
45
  // Update
46
  //.add_systems(Update, flying_labels)
47
-
48
  // PreUpdate
49
  .add_systems(PreUpdate, spawn_tooltip);
50
  }
 
1
  use bevy::prelude::*;
2
 
3
+ use aery::prelude::*;
4
  use release_label::release_label;
5
  use tooltip::spawn_tooltip;
 
 
6
 
7
  //use keycap_demo::keycap_demo;
8
 
 
34
  pub(crate) fn plugin(app: &mut bevy::app::App) {
35
  // Resources
36
  app.insert_resource(ClearColor(Color::DARK_GRAY))
 
 
 
37
  // Startup
38
  //.add_systems(Startup, keycap_demo)
39
  .add_systems(Startup, release_label)
 
40
  // Update
41
  //.add_systems(Update, flying_labels)
 
42
  // PreUpdate
43
  .add_systems(PreUpdate, spawn_tooltip);
44
  }