diff --git a/README.md b/README.md index 15df295..ebd3e6c 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,17 @@ logic mostly like https://git.crispypin.cc/CrispyPin/marble - option to use 8-bit marbles? - blueprint rotation? +# physics +- find direct bounces (todo consistency) +- execute direct bounces +- mark tiles as Claimed, ClaimedIndirect, BlockedIndirect, Blocked +- direct movements can move to any but Blocked tiles +- indirect movements can only move to ClaimedIndirect +- Claimed + ClaimedIndirect = BlockedIndirect +- ClaimedIndirect + ClaimedIndirect = BlockedIndirect +- Claimed + Claimed = Blocked +- BlockedIndirect + Claimed = Claimed + ## file hierarchy ``` - assets/ diff --git a/src/editor.rs b/src/editor.rs index 81abaab..2120942 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -269,15 +269,7 @@ impl Editor { let max = selection.0.max(selection.1) + (1, 1).into(); let width = (max.x - min.x) as usize; let height = (max.y - min.y) as usize; - let mut board = Board::new_empty(width, height); - for (target_x, x) in (min.x..=max.x).enumerate() { - for (target_y, y) in (min.y..=max.y).enumerate() { - if let Some(tile) = self.source_board.get(Pos { x, y }) { - board.set((target_x, target_y).into(), tile); - } - } - } - board + self.source_board.get_rect(min, width, height) } fn save_blueprint(&mut self, selection: (Pos, Pos)) { @@ -914,14 +906,7 @@ impl Editor { self.grow_board_and_update_view( &mut (pos + (board.width() - 1, board.height() - 1).into()), ); - for x in 0..board.width() { - for y in 0..board.height() { - let p = (x, y).into(); - if let Some(tile) = board.get(p) { - self.source_board.set(p + pos, tile); - } - } - } + self.source_board.paste_board(pos, &board); } } return; @@ -1024,14 +1009,7 @@ impl Editor { self.grow_board_and_update_view( &mut (pos + (board.width() - 1, board.height() - 1).into()), ); - for x in 0..board.width() { - for y in 0..board.height() { - let p = (x, y).into(); - if let Some(tile) = board.get(p) { - self.source_board.set(p + pos, tile); - } - } - } + self.source_board.paste_board(pos, &board); } } } diff --git a/src/marble_engine/board.rs b/src/marble_engine/board.rs index 7a401d3..907e0db 100644 --- a/src/marble_engine/board.rs +++ b/src/marble_engine/board.rs @@ -117,7 +117,31 @@ impl Board { } } - pub fn grow_to_include(&mut self, p: Pos) -> (PosInt,PosInt) { + pub fn paste_board(&mut self, pos: Pos, source: &Board) { + for x in 0..source.width() { + for y in 0..source.height() { + let offset = (x, y).into(); + if let Some(tile) = source.get(offset) { + self.set(offset + pos, tile); + } + } + } + } + + pub fn get_rect(&self, pos: Pos, width: usize, height: usize) -> Board { + let mut out = Board::new_empty(width, height); + for x in 0..width { + for y in 0..height { + let offset = (x, y).into(); + if let Some(tile) = self.get(offset + pos) { + out.set(offset, tile); + } + } + } + out + } + + pub fn grow_to_include(&mut self, p: Pos) -> (PosInt, PosInt) { let mut offset_x = 0; let mut offset_y = 0; if p.x < 0 {