-
-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Description
What problem does this solve or what need does it fill?
I'm working on a game that uses a lot of different 'status effects'. These status effects are presently implemented on each character as an inserted/removed component, but I am interested in exploring these with always-inserted bool fields instead (akin to Visibility). The main issue I have is that I won't be able to filter out entities as easily as I can presently (like finding all poisoned entities by using With<Poisoned>).
What solution would you like?
UPDATE: Working proof of concept: https://crates.io/crates/bevy_mod_check_filter
A Query Filter pair akin to With/Without, that instead of checking for component existence, checks for component value. Given we don't have full const generics yet, this should probably be limited to true/false for simplicity. Alternatively, the current value could be compared to the Default value.
The name for these filters? Unsure. Maybe Truthy/Falsey or Enabled/Disabled?
Illustration
Today:
#[derive(Component)]
struct Poisoned;
fn all_poisoned(entities: Query<&Name, With<Poisoned>>) {
// ...
}New query filter (see how we don't lose the ergonomics of marker components?):
#[derive(Component)]
struct Poisoned(bool);
// We will need some machinery like Deref or Into to extract the current value, but I'll leave that for discussion.
fn all_poisoned(entities: Query<&Name, Enabled<Poisoned>>) {
}What alternative(s) have you considered?
Filtering the way that the Visibility struct does presently. It's not the best ergonomics, though.
Additional context
Related to the discussion found in #3796.