rewrite power propagation

This commit is contained in:
Crispy 2024-12-09 20:43:15 +01:00
parent e6f99d3776
commit e223a75c0e
5 changed files with 263 additions and 184 deletions

View file

@ -101,16 +101,6 @@ impl Board {
}
}
pub fn get_blank_mut(&mut self, p: Pos) -> Option<&mut Tile> {
if self.in_bounds(p) {
let tile = &mut self.rows[p.y as usize][p.x as usize];
if let Tile::Open(OpenTile::Blank, _) = tile{
return Some(tile);
}
}
None
}
pub fn set(&mut self, p: Pos, tile: Tile) {
if self.in_bounds(p) {
self.rows[p.y as usize][p.x as usize] = tile;

View file

@ -4,16 +4,18 @@ pub type MarbleValue = u32;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Tile {
Open(OpenTile, MarbleTarget),
Open(OpenTile, Claim),
Block,
Marble { value: MarbleValue, dir: Direction },
Mirror(MirrorType),
Arrow(Direction),
Trigger(bool),
Wire(WireType, bool),
Powerable(PTile, bool),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MarbleTarget {
pub enum Claim {
Free,
ClaimedIndirect,
BlockedIndirect,
@ -29,8 +31,6 @@ pub enum OpenTile {
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PTile {
Trigger,
Wire(WireType),
Gate(GateType),
Math(MathOp),
Bag,
@ -78,7 +78,7 @@ pub enum Direction {
impl Default for Tile {
fn default() -> Self {
Tile::Open(OpenTile::Blank, MarbleTarget::Free)
Tile::Open(OpenTile::Blank, Claim::Free)
}
}
@ -89,10 +89,10 @@ impl Tile {
value: 0,
dir: Direction::Down,
},
'*' => Tile::Powerable(PTile::Trigger, false),
'-' => Tile::Powerable(PTile::Wire(WireType::Horizontal), false),
'|' => Tile::Powerable(PTile::Wire(WireType::Vertical), false),
'+' => Tile::Powerable(PTile::Wire(WireType::Cross), false),
'*' => Tile::Trigger(false),
'-' => Tile::Wire(WireType::Horizontal, false),
'|' => Tile::Wire(WireType::Vertical, false),
'+' => Tile::Wire(WireType::Cross, false),
'/' => Tile::Mirror(MirrorType::Forward),
'\\' => Tile::Mirror(MirrorType::Back),
'^' => Tile::Arrow(Direction::Up),
@ -111,9 +111,9 @@ impl Tile {
'D' => Tile::Powerable(PTile::Math(MathOp::Div), false),
'R' => Tile::Powerable(PTile::Math(MathOp::Rem), false),
'B' => Tile::Powerable(PTile::Bag, false),
d @ '0'..='9' => Tile::Open(OpenTile::Digit(d as u8 - b'0'), MarbleTarget::Free),
d @ '0'..='9' => Tile::Open(OpenTile::Digit(d as u8 - b'0'), Claim::Free),
'#' => Tile::Block,
_ => Tile::Open(OpenTile::Blank, MarbleTarget::Free),
_ => Tile::Open(OpenTile::Blank, Claim::Free),
}
}
@ -133,13 +133,13 @@ impl Tile {
Direction::Left => '<',
Direction::Right => '>',
},
Tile::Trigger(_) => '*',
Tile::Wire(wire, _) => match wire {
WireType::Vertical => '|',
WireType::Horizontal => '-',
WireType::Cross => '+',
},
Tile::Powerable(tile, _) => match tile {
PTile::Trigger => '*',
PTile::Wire(wire) => match wire {
WireType::Vertical => '|',
WireType::Horizontal => '-',
WireType::Cross => '+',
},
PTile::Gate(gate) => match gate {
GateType::LessThan => 'L',
GateType::GreaterThan => 'G',
@ -180,10 +180,22 @@ impl Tile {
Tile::Open(OpenTile::Digit(n), _) => return format!("tile_digit_{n}"),
Tile::Mirror(mirror) => mirror.texture_name(),
Tile::Arrow(dir) => dir.arrow_tile_texture_name(),
Tile::Trigger(state) => {
if *state {
"trigger_on"
} else {
"trigger_off"
}
}
Tile::Wire(wire, state) => {
return format!(
"{}_{}",
wire.texture_name(),
if *state { "on" } else { "off" }
)
}
Tile::Powerable(tile, state) => {
let root = match tile {
PTile::Trigger => "trigger",
PTile::Wire(wire) => wire.texture_name(),
PTile::Gate(gate) => gate.texture_name(),
PTile::Math(math_op) => math_op.texture_name(),
PTile::Bag => "bag",
@ -257,6 +269,14 @@ impl Direction {
}
impl WireType {
pub fn has_output(self, dir: Direction) -> bool {
match self {
WireType::Vertical => matches!(dir, Direction::Up | Direction::Down),
WireType::Horizontal => matches!(dir, Direction::Right | Direction::Left),
WireType::Cross => true,
}
}
pub fn directions(self) -> &'static [Direction] {
match self {
WireType::Vertical => &[Direction::Up, Direction::Down],