Compare commits

...

3 commits

5 changed files with 39 additions and 35 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 B

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 342 B

View file

@ -444,23 +444,20 @@ impl Editor {
}
pub fn draw(&mut self, d: &mut RaylibDrawHandle, textures: &Textures) {
d.clear_background(gray(48));
d.clear_background(BG_WORLD);
if self.draw_overlay && self.zoom >= 1. {
let tile_size = (TILE_TEXTURE_SIZE * self.zoom) as f32;
if self.draw_overlay && self.zoom >= 0.5 {
let tile_size = TILE_TEXTURE_SIZE * self.zoom;
let grid_spill_x = (self.view_offset.x).rem(tile_size) - tile_size;
let grid_spill_y = (self.view_offset.y).rem(tile_size) - tile_size;
d.gui_grid(
Rectangle::new(
grid_spill_x,
grid_spill_y,
d.get_screen_width() as f32 * 2.,
d.get_screen_height() as f32 * 2.,
),
None,
tile_size,
1,
);
for y in 0..=(d.get_screen_height() / tile_size as i32) {
let y = y * tile_size as i32 + grid_spill_y as i32;
d.draw_line(0, y, d.get_screen_width(), y, FG_GRID);
}
for x in 0..=(d.get_screen_width() / tile_size as i32) {
let x = x * tile_size as i32 + grid_spill_x as i32;
d.draw_line(x, 0, x, d.get_screen_height(), FG_GRID);
}
}
self.draw_board(d, textures);

View file

@ -179,25 +179,6 @@ impl Machine {
};
}
for &(pos, _val, _dir) in &new_marbles {
let Some(Tile::Open(OpenTile::Blank, claim)) = self.board.get_mut(pos) else {
unreachable!()
};
*claim = match claim {
Claim::Free => Claim::Claimed,
Claim::Claimed | Claim::Blocked => Claim::Blocked,
_ => unreachable!(),
}
}
// new marbles are past old_marbles index, so will not move this step
for (pos, value, dir) in new_marbles {
let Some(Tile::Open(OpenTile::Blank, Claim::Claimed)) = self.board.get_mut(pos) else {
continue;
};
self.board.set(pos, Tile::Marble { value, dir });
self.marbles.push(pos);
}
// old wires have to be reset after machine processing,
// so they can figure out which directions they are powered from
for &p in &self.powered {
@ -220,7 +201,7 @@ impl Machine {
Multiple,
}
// find all direct bounces
// #### find all direct bounces ####
let mut will_reverse_direction = vec![false; self.marbles.len()];
// todo store in tile to remove search through self.marbles
let mut influenced_direction = vec![DirInfluence::None; self.marbles.len()];
@ -261,7 +242,7 @@ impl Machine {
_ => (),
}
}
// apply all direct bounces
// #### apply all direct bounces ####
for (i, &pos) in self.marbles.iter().enumerate() {
let Some(Tile::Marble { value: _, dir }) = self.board.get_mut(pos) else {
unreachable!()
@ -273,6 +254,29 @@ impl Machine {
}
}
// #### new marbles ####
// prepare creating the new marbles
for &(pos, _val, _dir) in &new_marbles {
let Some(Tile::Open(OpenTile::Blank, claim)) = self.board.get_mut(pos) else {
unreachable!()
};
*claim = match claim {
Claim::Free => Claim::Claimed,
Claim::Claimed | Claim::Blocked => Claim::Blocked,
_ => unreachable!(),
}
}
// create new marbles
// new marbles are past old_marbles index, so will not move this step
for (pos, value, dir) in new_marbles {
let Some(Tile::Open(OpenTile::Blank, Claim::Claimed)) = self.board.get_mut(pos) else {
continue;
};
self.board.set(pos, Tile::Marble { value, dir });
self.marbles.push(pos);
}
// #### movement ####
let mut claim_positions = Vec::new();
// mark claims to figure out what spaces can be moved to
for &pos in &self.marbles[..old_marbles] {

View file

@ -1,5 +1,8 @@
use raylib::prelude::*;
pub const BG_WORLD: Color = gray(48);
pub const FG_GRID: Color = gray(64);
pub const BG_DARK: Color = gray(32);
pub const BG_MEDIUM: Color = gray(48);
pub const BG_LIGHT: Color = gray(64);