From a224a74d054fec96a728b2d0ee7471b1cecc6fb5 Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Sun, 5 Jan 2025 22:03:29 +0200 Subject: [PATCH 1/2] feat(hints): add hint systems --- assets/images/hints/arrows.png | Bin 0 -> 1136 bytes assets/images/hints/interaction.png | Bin 0 -> 1136 bytes src/hint/assets.rs | 26 +++++++++ src/hint/components.rs | 35 ++++++++++++ src/hint/mod.rs | 13 +++++ src/hint/systems/check.rs | 84 ++++++++++++++++++++++++++++ src/hint/systems/mod.rs | 16 ++++++ src/hint/systems/setup.rs | 23 ++++++++ src/lib.rs | 2 + src/player/assets.rs | 4 +- src/screens/gameplay.rs | 9 ++- 11 files changed, 208 insertions(+), 4 deletions(-) create mode 100644 assets/images/hints/arrows.png create mode 100644 assets/images/hints/interaction.png create mode 100644 src/hint/assets.rs create mode 100644 src/hint/components.rs create mode 100644 src/hint/mod.rs create mode 100644 src/hint/systems/check.rs create mode 100644 src/hint/systems/mod.rs create mode 100644 src/hint/systems/setup.rs diff --git a/assets/images/hints/arrows.png b/assets/images/hints/arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6554f12e2216766d84a5b4a74ea2d74ca1570a GIT binary patch literal 1136 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wqv7G|JG$LX49KuRdUC&X1sT>9O+cmMzYXJTYt zvwBThO4|On5<(0NERvosjv*Dd-rhNwH`_s^_2I+~-wn?(OQgJ?81RiZ?|biu-}c^# zZIaC!56(XJ-Q|Cd)G8f2)gR~X99CV&v-(D>YT-+VW;R|alZ*=s9RIs~`H*k-Xa5mZ z5DzT;LcVhuCj(TznawxL>p2rdF;IHe6%nvLu*#L1bGhN#GJ=9(CS+V#vdn}LX592e z-7z24|Go|us9mwIt$0~LR@JK4-7&%eJJ#HLlJsIv>AHK*l3r|neMP=k>{r0oSFeIs zZM6NCF@33$Qlp;H^Q&J~^;0hVTlVc$Zh-fK`>Phb>+%R*)ndB5 zc}w>1T_XCuacNA7juH3DZ zB>Ok)?h1F;BRS@Evlb>NCrHGml49WrmsWRF02)txv+nK{EmM+zD~{kd|TtV?5l9S?>$u+JjY&qkUn+D>;8|} z>F3w%%6hlhcl`y4j)lp)6xz|So(boKF~@a64yU9;VDo|GN2+8S&1;@7PQujVXwuUz8w z+{m-e^n&wEf!D{RcjnpDva|{<%f9LH;$ipq#JBste)_w!xZcp&|Cn07oBjXKssCKE zUY%|Wvzy!MUL54l^vF3N_FUl^1~-Q9O+cmMzYXJTYt zvwBThO4|On5<(0NERvosjv*Dd-rhNwH`_s^_2I+~-wn?(OQgJ?81RiZ?|biu-}c^# zZIaC!56(XJ-Q|Cd)G8f2)gR~X99CV&v-(D>YT-+VW;R|alZ*=s9RIs~`H*k-Xa5mZ z5DzT;LcVhuCj(TznawxL>p2rdF;IHe6%nvLu*#L1bGhN#GJ=9(CS+V#vdn}LX592e z-7z24|Go|us9mwIt$0~LR@JK4-7&%eJJ#HLlJsIv>AHK*l3r|neMP=k>{r0oSFeIs zZM6NCF@33$Qlp;H^Q&J~^;0hVTlVc$Zh-fK`>Phb>+%R*)ndB5 zc}w>1T_XCuacNA7juH3DZ zB>Ok)?h1F;BRS@Evlb>NCrHGml49WrmsWRF02)txv+nK{EmM+zD~{kd|TtV?5l9S?>$u+JjY&qkUn+D>;8|} z>F3w%%6hlhcl`y4j)lp)6xz|So(boKF~@a64yU9;VDo|GN2+8S&1;@7PQujVXwuUz8w z+{m-e^n&wEf!D{RcjnpDva|{<%f9LH;$ipq#JBste)_w!xZcp&|Cn07oBjXKssCKE zUY%|Wvzy!MUL54l^vF3N_FUl^1~-Q, + #[dependency] + pub interaction: Handle, +} + +impl HintAssets { + pub const PATH_ARROWS: &str = "images/hints/arrows.png"; + pub const PATH_INTERACTION: &str = "images/hints/interaction.png"; +} + +impl FromWorld for HintAssets { + fn from_world(world: &mut World) -> Self { + let assets = world.resource::(); + + Self { + arrows: assets.load(Self::PATH_ARROWS), + interaction: assets.load(Self::PATH_INTERACTION), + } + } +} diff --git a/src/hint/components.rs b/src/hint/components.rs new file mode 100644 index 0000000..ad68d4e --- /dev/null +++ b/src/hint/components.rs @@ -0,0 +1,35 @@ +use std::time::Duration; + +use bevy::prelude::*; + +#[derive(Debug, Reflect, Component, PartialEq, Eq)] +#[reflect(Component)] +pub enum Hint { + Movement, + Interaction, +} + +#[derive(Debug, Reflect, Component)] +#[reflect(Component)] +pub struct IdleTimer { + pub timer: Timer, + pub movement_hint_visible: bool, + pub interaction_hint_visible: bool, +} + +impl IdleTimer { + pub fn hide_all(&mut self) { + self.movement_hint_visible = false; + self.interaction_hint_visible = false; + } +} + +impl Default for IdleTimer { + fn default() -> Self { + Self { + timer: Timer::new(Duration::from_secs(3), TimerMode::Once), + movement_hint_visible: false, + interaction_hint_visible: false, + } + } +} diff --git a/src/hint/mod.rs b/src/hint/mod.rs new file mode 100644 index 0000000..a34f165 --- /dev/null +++ b/src/hint/mod.rs @@ -0,0 +1,13 @@ +pub mod assets; +pub mod components; +mod systems; + +use bevy::{ecs::system::RunSystemOnce, prelude::*}; + +pub(super) fn plugin(app: &mut App) { + app.add_plugins(systems::plugin); +} + +pub fn spawn_hint_command(world: &mut World) { + let _ = world.run_system_once(systems::setup::setup); +} diff --git a/src/hint/systems/check.rs b/src/hint/systems/check.rs new file mode 100644 index 0000000..eb12f29 --- /dev/null +++ b/src/hint/systems/check.rs @@ -0,0 +1,84 @@ +use bevy::prelude::*; +use hexx::Hex; + +use crate::{ + floor::components::CurrentFloor, + hint::components::{Hint, IdleTimer}, + maze::components::MazeConfig, + player::components::{CurrentPosition, MovementTarget, Player}, +}; + +pub fn check_player_hints( + mut idle_query: Query<&mut IdleTimer>, + player_query: Query<(&CurrentPosition, &MovementTarget), With>, + maze_query: Query<&MazeConfig, With>, + mut hint_query: Query<(&mut Visibility, &Hint)>, + time: Res