merge input and output tiles into one, where output is accomplished by marbles moving into the tile, like a bag

This commit is contained in:
Crispy 2024-10-08 22:04:12 +02:00
parent ae4e84bb90
commit 9f21c2b258
10 changed files with 11 additions and 19 deletions

View file

@ -128,7 +128,7 @@ impl Machine {
.iter()
.map(|&pos| {
let marble = self.board.get(pos).unwrap();
let Tile::Marble { value: _, dir } = marble else {
let Tile::Marble { value, dir } = marble else {
panic!("broken marble");
};
let front_pos = dir.step(pos);
@ -139,6 +139,10 @@ impl Machine {
if let Tile::Powerable(PTile::Bag, _) = front_tile {
return Event::Remove;
}
if let Tile::Powerable(PTile::IO, _) = front_tile{
self.output.push(value as u8);
return Event::Remove;
}
let can_move_to = |tile| matches!(tile, Some(Tile::Blank | Tile::Digit(_)));
@ -307,19 +311,13 @@ impl Machine {
self.propagate_power(*d, d.step(pos));
}
}
PTile::Output => {
let sample = self.board.get_or_blank(front_pos);
if let Tile::Marble { value, dir: _ } = sample {
self.output.push(value as u8);
}
}
PTile::Bag => {
if let Some(front) = self.board.get_blank_mut(front_pos) {
*front = Tile::Marble { value: 0, dir };
self.marbles.push(front_pos);
}
}
PTile::Input => {
PTile::IO => {
if let Some(front) = self.board.get_blank_mut(front_pos) {
if self.input_index < self.input.len() {
let value = self.input[self.input_index] as MarbleValue;