summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.rs42
1 files changed, 30 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs
index 99898b3..66044bc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -142,6 +142,28 @@ impl Figure {
}
}
+trait Cell {
+ fn is_ghost(&self) -> bool;
+ fn set_ghost(&mut self, ghost: bool);
+ fn color(&self) -> Self;
+}
+
+impl Cell for u8 {
+ fn is_ghost(&self) -> bool {
+ *self & GHOST_MASK != 0
+ }
+ fn set_ghost(&mut self, ghost: bool) {
+ if ghost {
+ *self |= GHOST_MASK;
+ } else {
+ *self &= !GHOST_MASK;
+ }
+ }
+ fn color(&self) -> Self {
+ self & !GHOST_MASK
+ }
+}
+
#[derive(Clone)]
struct Field {
cells: [u8; FIELD_SIZE],
@@ -164,11 +186,9 @@ impl Field {
if f_x < 0 || f_x >= FIELD_COLS as isize || f_y < 0 || f_y >= FIELD_ROWS as isize {
continue;
}
- let color = figure.cells[i] & !GHOST_MASK;
+ let color = figure.cells[i].color();
let current = f_x as usize + f_y as usize * FIELD_COLS;
- let ghost_or_empty =
- (self.cells[current] & GHOST_MASK != 0) || self.cells[current] == 0;
- if color != 0 && ghost_or_empty {
+ if color != 0 && (self.cells[current].is_ghost() || self.cells[current] == 0) {
self.cells[current] = figure.cells[i];
}
}
@@ -177,12 +197,12 @@ impl Field {
for i in 0..FIGURE_SIZE {
let f_x = (i % FIGURE_SIZE_COLS) as isize + x;
let f_y = (i / FIGURE_SIZE_ROWS) as isize + y;
- let color = figure.cells[i] & !GHOST_MASK;
+ let color = figure.cells[i].color();
if color != 0 {
if f_x < 0 || f_x >= FIELD_COLS as isize || f_y < 0 || f_y >= FIELD_ROWS as isize {
return true;
}
- let fcolor = self.cells[f_x as usize + f_y as usize * FIELD_COLS] & !GHOST_MASK;
+ let fcolor = self.cells[f_x as usize + f_y as usize * FIELD_COLS].color();
if fcolor != 0 {
return true;
}
@@ -460,12 +480,10 @@ impl Tui {
fn display_field(&self, field: &Field, y: usize) {
print!("|");
for x in 0..FIELD_COLS {
- let color = field.cells[(FIELD_ROWS_VISIBLE - 1 - y) * FIELD_COLS + x] & !GHOST_MASK;
- let ghost =
- field.cells[(FIELD_ROWS_VISIBLE - 1 - y) * FIELD_COLS + x] & GHOST_MASK != 0;
- if color == 0 {
+ let cell = field.cells[(FIELD_ROWS_VISIBLE - 1 - y) * FIELD_COLS + x];
+ if cell.color() == 0 {
print!(" ");
- } else if ghost {
+ } else if cell.is_ghost() {
print!("░░");
} else {
print!("██");
@@ -479,7 +497,7 @@ impl Tui {
let mut field = game.field.clone();
let mut ghost = game.figure.clone();
for i in 0..FIGURE_SIZE {
- ghost.cells[i] |= GHOST_MASK;
+ ghost.cells[i].set_ghost(true);
}
let mut y_ghost = game.y;
while !field.has_collision(&ghost, game.x, y_ghost) {