rewrite power propagation
This commit is contained in:
parent
e6f99d3776
commit
e223a75c0e
5 changed files with 263 additions and 184 deletions
|
@ -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;
|
||||
|
|
|
@ -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],
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue