diff options
author | Justin Wernick <justin@worthe-it.co.za> | 2020-12-13 10:51:02 +0200 |
---|---|---|
committer | Justin Wernick <justin@worthe-it.co.za> | 2020-12-13 10:51:02 +0200 |
commit | 687aa58aad54fc4d20a519dcccb79f27b6093e4d (patch) | |
tree | 456615cef65cc7346a9e2b43b8c0e8bfdade1353 | |
parent | a33020141fe1439209dd46e8caf29144bd4463f8 (diff) |
Day 11
-rw-r--r-- | inputs/day_11.txt | 90 | ||||
-rw-r--r-- | src/bin/day_11.rs | 209 |
2 files changed, 299 insertions, 0 deletions
diff --git a/inputs/day_11.txt b/inputs/day_11.txt new file mode 100644 index 0000000..977ae5f --- /dev/null +++ b/inputs/day_11.txt @@ -0,0 +1,90 @@ +LLLLL.LLLLLL.LLLLLLLLL.LLL.LL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLL.LLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL +LLLLL.L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +L.LL.L.L.LL.....L.L..L.LL.L.L.L.....L..LLL.L.....L.L...LL..L.....L...L..L.LLLL..L.LL......L.L.L. +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL. +LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +......LL..LLLL.L...LL.....L.L.......L..L.LL....L.LLL........L.L.L.LL.....L.........L....L......L +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL..LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLL..LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +.L...L...L.....L...L....L.LL.LLL.LL...LL.L..L...L......L..LL..L..LL..L.L......L.L.LLL......L.L.. +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLL.LLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LL.LL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +...........LLL.....LLL.....LL.L..........L..L.L.L...L.L.....L........L......L..L..L...LL....L.L. +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLL.LLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLL.LLLL.L.LLLL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLL.LLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLL.L.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.L.LLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLLLLLL +L.......LL...LL...L..L.....L..LL..L.L.LLL.L.L..L.LL.L.........L....LLLL..LL..L.L..L..LLLL..LL.L. +LLLLL.LLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLL..LLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +....LLL.LL....L.L.........L.L............L..L...L.LLLL......L...L.L..L....L.......L..L.......... +LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLL.LL.L.LLLLL.LLLLLL.LLLLLL.LLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LL.L.LLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.L..LLL..LLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL..LLLLL.LLLLLLLLL.LLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +.L..LLLL..L.L.LLL.......LL.LL.LL......L.L....L.LLL.......L...L.L.LL...LL.....L.L....L.L...L.L... +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLL +LLLLL.LL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL..LLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLL.LL +LLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLL +LLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +.L..L..LLL....LL......LL.L.L..LL..LL....L...L..L.L.L...L..L..L.LLLL.L....L.....L..L...L...LLL... +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.L.LLLLLL.LLLL.LLL.LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +..LL.LL.L.LL.L...L..L..L..L...LL........L......LL.LLLL.......L..LLL.L.L....L.....L..LL..L.LL.LL. +LLLLL.LLLL.L.LLLLL.LLL.LLLLLL.LLLLLLL.LL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL..LLLLL.LLLLLLL.LLLL.LLLLLLLLLLL.LLLL..LLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLL +LLLLL.LLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLL..LLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LL.LL.LLL.LL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL..LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +.LL..LL.L.LL......L.L.LL...L..LL..LL...L..L.L..LL...L.L..L.....L.LLL..L..LL.L..L.......L..LLL... +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL..LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLL.LL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LL.LLL.LLLL.LLLLL.LLLLLL.LL.L.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +.L.L....LLL.L.L........L..L....L..L...LL..L..LLL..L.L....L..L.LL....LL.L.L.....L........L..L.L.. +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLL +LLLLL.LLLLLL.LLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLL.LL..LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLL..L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL..LLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.L.LL..LLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL diff --git a/src/bin/day_11.rs b/src/bin/day_11.rs new file mode 100644 index 0000000..82bb282 --- /dev/null +++ b/src/bin/day_11.rs @@ -0,0 +1,209 @@ +use bevy::prelude::*; +use std::fs::File; +use std::io::{BufRead, BufReader}; + +fn main() { + App::build() + .add_resource(WindowDescriptor { + title: "Advent of Code".to_string(), + width: 1920, + height: 1080, + ..Default::default() + }) + .add_event::<AdjacentStableEvent>() + .add_event::<LineOfSightStableEvent>() + .add_resource(ClearColor(Color::rgb(0., 0., 0.))) + .add_startup_system(setup_camera.system()) + .add_startup_system(read_input_file.system()) + .add_system(iterate_adjacent_seats.system()) + .add_system(iterate_line_of_sight_seats.system()) + .add_system(report_adjacent_done.system()) + .add_system(report_line_of_sight_done.system()) + .add_plugins(DefaultPlugins) + .run(); +} + +fn setup_camera(mut commands: Commands) { + commands.spawn(Camera2dComponents::default()); +} + +#[derive(PartialEq, Eq, Clone, Copy)] +struct Position { + x: i32, + y: i32, +} +impl Position { + fn distance(&self, other: &Position) -> i32 { + (self.x - other.x).abs().max((self.y - other.y).abs()) + } +} +impl std::ops::Add<&Position> for Position { + type Output = Position; + fn add(self, other: &Position) -> Self::Output { + Position { + x: self.x + other.x, + y: self.y + other.y, + } + } +} + +struct AdjacentSeat { + occupied: bool, +} +struct LineOfSightSeat { + occupied: bool, +} + +struct AdjacentStableEvent; +struct LineOfSightStableEvent; + +#[derive(Default)] +struct Bounds { + min_x: i32, + max_x: i32, + min_y: i32, + max_y: i32, +} + +fn read_input_file(mut commands: Commands) { + let f = File::open("./inputs/day_11.txt").unwrap(); + let mut bounds = Bounds::default(); + + for (y, line) in BufReader::new(f).lines().enumerate() { + let line = line.unwrap(); + let line = line.trim(); + for (x, c) in line.chars().enumerate() { + if c == 'L' { + commands.spawn(( + Position { + x: x as i32, + y: y as i32, + }, + AdjacentSeat { occupied: false }, + LineOfSightSeat { occupied: false }, + )); + } + bounds.max_x = x as i32; + } + + bounds.max_y = y as i32; + } + commands.insert_resource(bounds); +} + +fn iterate_adjacent_seats( + mut commands: Commands, + mut stable_events: ResMut<Events<AdjacentStableEvent>>, + seats: Query<(Entity, &Position, &AdjacentSeat)>, +) { + let mut changes: Vec<(Entity, AdjacentSeat)> = Vec::new(); + for (entity, position, seat) in seats.iter() { + let surrounding_count = seats + .iter() + .filter(|(_, other_position, other_seat)| { + other_seat.occupied && position.distance(other_position) == 1 + }) + .count(); + let change = if !seat.occupied && surrounding_count == 0 { + Some(true) + } else if seat.occupied && surrounding_count >= 4 { + Some(false) + } else { + None + }; + if let Some(occupied) = change { + changes.push((entity, AdjacentSeat { occupied })); + } + } + if changes.is_empty() { + stable_events.send(AdjacentStableEvent); + } + + for (entity, seat) in changes { + commands.insert_one(entity, seat); + } +} + +fn iterate_line_of_sight_seats( + mut commands: Commands, + mut stable_events: ResMut<Events<LineOfSightStableEvent>>, + bounds: Res<Bounds>, + seats: Query<(Entity, &Position, &LineOfSightSeat)>, +) { + let dir_vectors = [ + Position { x: -1, y: 0 }, + Position { x: -1, y: -1 }, + Position { x: 0, y: -1 }, + Position { x: 1, y: -1 }, + Position { x: 1, y: 0 }, + Position { x: 1, y: 1 }, + Position { x: 0, y: 1 }, + Position { x: -1, y: 1 }, + ]; + + let mut changes: Vec<(Entity, LineOfSightSeat)> = Vec::new(); + for (entity, position, seat) in seats.iter() { + let mut surrounding_count = 0; + for vec in dir_vectors.iter() { + let mut check = position.clone(); + while check.x >= bounds.min_x + && check.x <= bounds.max_x + && check.y >= bounds.min_y + && check.y <= bounds.max_y + { + check = check + vec; + if let Some((_, _, other_seat)) = + seats.iter().find(|(_, other_pos, _)| other_pos == &&check) + { + if other_seat.occupied { + surrounding_count += 1; + } + break; + } + } + } + + let change = if !seat.occupied && surrounding_count == 0 { + Some(true) + } else if seat.occupied && surrounding_count >= 5 { + Some(false) + } else { + None + }; + if let Some(occupied) = change { + changes.push((entity, LineOfSightSeat { occupied })); + } + } + if changes.is_empty() { + stable_events.send(LineOfSightStableEvent); + } + + for (entity, seat) in changes { + commands.insert_one(entity, seat); + } +} + +fn report_adjacent_done( + stable_events: Res<Events<AdjacentStableEvent>>, + mut stable_event_reader: Local<EventReader<AdjacentStableEvent>>, + seats: Query<&AdjacentSeat>, +) { + for _ in stable_event_reader.iter(&stable_events) { + let occupied = seats.iter().filter(|s| s.occupied).count(); + println!("{} seats end up occupied in the adjacent model", occupied); + } +} + +fn report_line_of_sight_done( + stable_events: Res<Events<LineOfSightStableEvent>>, + mut stable_event_reader: Local<EventReader<LineOfSightStableEvent>>, + seats: Query<&LineOfSightSeat>, +) { + for _ in stable_event_reader.iter(&stable_events) { + let occupied = seats.iter().filter(|s| s.occupied).count(); + println!( + "{} seats end up occupied in the line of sight model", + occupied + ); + } +} |