add digit tool

This commit is contained in:
Crispy 2024-10-05 20:22:18 +02:00
parent 465b5c40d1
commit fc6c66ff31
5 changed files with 130 additions and 65 deletions

View file

@ -1,7 +1,7 @@
use std::{fs::read_to_string, ops::Rem};
use marble_engine::{
board::Board,
board::{Board, Pos},
tile::{Direction, GateType, MathOp, MirrorType, PTile, Tile, WireType},
Machine,
};
@ -31,16 +31,16 @@ struct Game {
time_since_step: f32,
}
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone)]
enum Tool {
None,
SetTile(Tile),
Digits(Option<Pos>),
Math,
Gate,
Wire,
Arrow,
Mirror,
Number,
// SelectArea,
}
@ -149,7 +149,7 @@ impl Game {
}
Tool::None => (),
Tool::SetTile(_) => (),
Tool::Number => (),
Tool::Digits(_) => (),
}
}
@ -271,7 +271,7 @@ impl Game {
texture_button(
d,
Vector2 {
x: 300. + col as f32 * bound_offset - if col < 0 { 15. } else { 0. },
x: 320. + col as f32 * bound_offset - if col < 0 { 15. } else { 0. },
y: footer_top + 5. + row as f32 * bound_offset,
},
textures.get(texture),
@ -281,7 +281,8 @@ impl Game {
border,
);
};
tool_button((0, -1), "eraser", Tool::SetTile(Tile::from_char(' ')));
tool_button((0, -2), "eraser", Tool::SetTile(Tile::from_char(' ')));
tool_button((0, -1), "digit_tool", Tool::Digits(None));
tool_button((1, -1), "transparent", Tool::None);
tool_button((0, 0), "block", Tool::SetTile(Tile::from_char('#')));
@ -325,63 +326,110 @@ impl Game {
}
let mouse_pos = d.get_mouse_position();
if self.sim_state == SimState::Editing && mouse_pos.y < footer_top {
let tile_pos = (mouse_pos - self.view_offset) / (16 << self.zoom) as f32;
let tile_pos = Vector2::new(tile_pos.x.floor(), tile_pos.y.floor());
let tile_screen_pos = tile_pos * (16 << self.zoom) as f32 + self.view_offset;
if self.active_tool != Tool::None {
let tex = match self.active_tool {
Tool::None => unreachable!(),
Tool::SetTile(t) => {
if t == Tile::Blank {
"selection".into()
} else {
t.texture()
}
}
Tool::Math => format!("{}_off", self.tool_menu_math.texture_name()),
Tool::Gate => format!("{}_off", self.tool_menu_gate.texture_name()),
Tool::Wire => format!("{}_off", self.tool_menu_wire.texture_name()),
Tool::Arrow => self.tool_menu_arrow.arrow_texture_name().into(),
Tool::Mirror => self.tool_menu_mirror.texture_name().into(),
Tool::Number => todo!(),
};
if self.sim_state == SimState::Editing {
if let Tool::Digits(Some(pos)) = &mut self.active_tool {
let tile_screen_pos = pos.to_vec() * (16 << self.zoom) as f32 + self.view_offset;
d.draw_texture_ex(
textures.get(&tex),
textures.get("selection"),
tile_screen_pos,
0.,
(1 << self.zoom) as f32,
Color::new(255, 255, 255, 100),
Color::new(255, 180, 20, 255),
);
for n in 0..10 {
if d.is_key_pressed(unsafe { std::mem::transmute(KeyboardKey::KEY_ZERO as u32 + n) }) {
self.source_board.set(*pos, Tile::Digit(n as u8));
}
}
if d.is_key_pressed(KeyboardKey::KEY_LEFT) {
pos.x -= 1;
}
if d.is_key_pressed(KeyboardKey::KEY_RIGHT) {
pos.x += 1;
}
if d.is_key_pressed(KeyboardKey::KEY_UP) {
pos.y -= 1;
}
if d.is_key_pressed(KeyboardKey::KEY_DOWN) {
pos.y += 1;
}
}
if d.is_mouse_button_down(MouseButton::MOUSE_BUTTON_LEFT) {
match self.active_tool {
Tool::None => (),
Tool::SetTile(tile) => self.source_board.set(tile_pos.into(), tile),
Tool::Math => self.source_board.set(
tile_pos.into(),
Tile::Powerable(PTile::Math(self.tool_menu_math), false),
),
Tool::Gate => self.source_board.set(
tile_pos.into(),
Tile::Powerable(PTile::Gate(self.tool_menu_gate), false),
),
Tool::Wire => self.source_board.set(
tile_pos.into(),
Tile::Powerable(PTile::Wire(self.tool_menu_wire), false),
),
Tool::Arrow => self
.source_board
.set(tile_pos.into(), Tile::Arrow(self.tool_menu_arrow)),
Tool::Mirror => self
.source_board
.set(tile_pos.into(), Tile::Mirror(self.tool_menu_mirror)),
Tool::Number => todo!(),
if mouse_pos.y < footer_top {
let tile_pos = (mouse_pos - self.view_offset) / (16 << self.zoom) as f32;
let tile_pos = Vector2::new(tile_pos.x.floor(), tile_pos.y.floor());
let tile_screen_pos = tile_pos * (16 << self.zoom) as f32 + self.view_offset;
if self.active_tool != Tool::None {
let tex = match self.active_tool {
Tool::None => unreachable!(),
Tool::SetTile(t) => {
if t == Tile::Blank {
"selection".into()
} else {
t.texture()
}
}
Tool::Math => format!("{}_off", self.tool_menu_math.texture_name()),
Tool::Gate => format!("{}_off", self.tool_menu_gate.texture_name()),
Tool::Wire => format!("{}_off", self.tool_menu_wire.texture_name()),
Tool::Arrow => self.tool_menu_arrow.arrow_texture_name().into(),
Tool::Mirror => self.tool_menu_mirror.texture_name().into(),
Tool::Digits(_) => "selection".into(),
};
d.draw_texture_ex(
textures.get(&tex),
tile_screen_pos,
0.,
(1 << self.zoom) as f32,
Color::new(255, 255, 255, 100),
);
}
if d.is_mouse_button_down(MouseButton::MOUSE_BUTTON_LEFT) {
match self.active_tool {
Tool::None => (),
Tool::SetTile(tile) => self.source_board.set(tile_pos.into(), tile),
Tool::Math => self.source_board.set(
tile_pos.into(),
Tile::Powerable(PTile::Math(self.tool_menu_math), false),
),
Tool::Gate => self.source_board.set(
tile_pos.into(),
Tile::Powerable(PTile::Gate(self.tool_menu_gate), false),
),
Tool::Wire => self.source_board.set(
tile_pos.into(),
Tile::Powerable(PTile::Wire(self.tool_menu_wire), false),
),
Tool::Arrow => self
.source_board
.set(tile_pos.into(), Tile::Arrow(self.tool_menu_arrow)),
Tool::Mirror => self
.source_board
.set(tile_pos.into(), Tile::Mirror(self.tool_menu_mirror)),
Tool::Digits(_pos) => {
self.active_tool = Tool::Digits(Some(tile_pos.into()));
if let Some(tile) = self.source_board.get_mut(tile_pos.into()) {
if let Tile::Digit(_) = tile {
} else {
*tile = Tile::Digit(0);
}
}
}
}
}
}
}
}
}
impl PartialEq for Tool{
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::SetTile(l0), Self::SetTile(r0)) => l0 == r0,
(Self::Digits(_), Self::Digits(_)) => true,
_ => ::core::mem::discriminant(self) == ::core::mem::discriminant(other),
}
}
}