use bevy::prelude::*;
use crate::BrickTypeId;
#[derive(Event, Debug, Clone)]
pub struct MultiHitBrickHit {
pub entity: Entity,
pub previous_type: u8,
pub new_type: u8,
}
#[cfg(feature = "texture_manifest")]
pub fn watch_brick_type_changes(
mut bricks: Query<
(&BrickTypeId, &mut MeshMaterial3d<StandardMaterial>),
(With<crate::Brick>, Changed<BrickTypeId>),
>,
type_registry: Res<crate::systems::textures::TypeVariantRegistry>,
fallback: Option<Res<crate::systems::textures::FallbackRegistry>>,
) {
use crate::systems::textures::ObjectClass;
for (brick_type, mut material) in bricks.iter_mut() {
if let Some(handle) = type_registry.get(ObjectClass::Brick, brick_type.0) {
debug!(
target: "textures::brick_type",
type_id = brick_type.0,
"Swapping brick material for type variant"
);
material.0 = handle;
} else if let Some(fb) = &fallback {
debug!(
target: "textures::brick_type",
type_id = brick_type.0,
"No type variant for brick; using fallback"
);
material.0 = fb.brick.clone();
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn multi_hit_brick_hit_event_fields() {
let event = MultiHitBrickHit {
entity: Entity::PLACEHOLDER,
previous_type: 13,
new_type: 12,
};
assert_eq!(event.previous_type, 13);
assert_eq!(event.new_type, 12);
}
#[test]
fn multi_hit_brick_hit_event_clone() {
let event = MultiHitBrickHit {
entity: Entity::PLACEHOLDER,
previous_type: 10,
new_type: 20,
};
let cloned = event.clone();
assert_eq!(cloned.previous_type, event.previous_type);
assert_eq!(cloned.new_type, event.new_type);
}
}