From ee893b59478f9cdd389f192ab536b767ac92be86 Mon Sep 17 00:00:00 2001 From: Strangedusk Date: Wed, 6 Jul 2022 16:30:54 +0200 Subject: [PATCH] Kicking --- src/movement.zig | 88 ++++++++---------- .../h/8fb74d559dd889eac55495e9f1d9dc64.txt | 6 +- zig-cache/z/15c879599ff43bd66fcf3641638f0aa9 | Bin 17928 -> 23536 bytes 3 files changed, 42 insertions(+), 52 deletions(-) diff --git a/src/movement.zig b/src/movement.zig index e73f116..926b9e7 100644 --- a/src/movement.zig +++ b/src/movement.zig @@ -48,7 +48,6 @@ pub fn drop(grid: Grid, piece: Piece) Grid { for (piece.structure) |_, y| { for (piece.structure[y]) |_, x| { if (piece.structure[y][x]) { - new_grid.cells[@intCast(usize, piece.row + @intCast(i32, y))][@intCast(usize, piece.col + @intCast(i32, x))].free = false; new_grid.cells[@intCast(usize, piece.row + @intCast(i32, y))][@intCast(usize, piece.col + @intCast(i32, x))].color = piece.color; } @@ -66,13 +65,7 @@ pub fn shadow(grid: Grid, piece: Piece) Piece { fn checkCollision(grid: Grid, piece: Piece) bool { for (piece.structure) |_, y| { for (piece.structure[y]) |_, x| { - if (piece.structure[y][x] - and ((@intCast(i32, x) + piece.col > Grid.ncolumns - 1) - or (@intCast(i32, x) + piece.col < 0) - or (@intCast(i32, y) + piece.row > Grid.nrows - 1) - or (@intCast(i32, y) + piece.row < 0) - or (!grid.cells[@intCast(usize, piece.row + @intCast(i32, y))][@intCast(usize, piece.col + @intCast(i32, x))].free))) - { + if (piece.structure[y][x] and ((@intCast(i32, x) + piece.col > Grid.ncolumns - 1) or (@intCast(i32, x) + piece.col < 0) or (@intCast(i32, y) + piece.row > Grid.nrows - 1) or (@intCast(i32, y) + piece.row < 0) or (!grid.cells[@intCast(usize, piece.row + @intCast(i32, y))][@intCast(usize, piece.col + @intCast(i32, x))].free))) { return true; } } @@ -83,64 +76,61 @@ fn checkCollision(grid: Grid, piece: Piece) bool { pub fn rotateLeft(grid: Grid, piece: Piece) Piece { var new_piece = piece.rotate(Piece.Rot.left); new_piece = kick(grid, new_piece, piece); - std.debug.print("{}\n",.{new_piece.rot_stage}); + std.debug.print("{}\n", .{new_piece.rot_stage}); return new_piece; } pub fn rotateRight(grid: Grid, piece: Piece) Piece { var new_piece = piece.rotate(Piece.Rot.right); new_piece = kick(grid, new_piece, piece); - std.debug.print("{}\n",.{new_piece.rot_stage}); + std.debug.print("{}\n", .{new_piece.rot_stage}); return new_piece; } pub fn kick(grid: Grid, piece: Piece, prev_piece: Piece) Piece { + // O piece does not rotate if (piece.piece_type == Piece.Type.o) return piece; + // Get the rotation stage for appropiate checks const prev_stage = prev_piece.rot_stage; const next_stage = piece.rot_stage; var new_piece = piece; + // Test 1 + if (!checkCollision(grid, new_piece)) return new_piece; + + var offsets: [4][2]i8 = undefined; + if (piece.piece_type == Piece.Type.i) { - if (!checkCollision(grid, new_piece)) return new_piece; - } //TODO - - if ( - (prev_stage == Piece.RotStage.init and next_stage == Piece.RotStage.right) - or (prev_stage == Piece.RotStage.flip and next_stage == Piece.RotStage.right) - or (prev_stage == Piece.RotStage.left and next_stage == Piece.RotStage.flip) - or (prev_stage == Piece.RotStage.left and next_stage == Piece.RotStage.init) - ) { - // Test Positions - if (!checkCollision(grid, new_piece)) return new_piece; - - new_piece.col -= 1; - if (!checkCollision(grid, new_piece)) return new_piece; - - new_piece.row -= 1; - if (!checkCollision(grid, new_piece)) return new_piece; - - new_piece.col += 1; - new_piece.row += 3; - if (!checkCollision(grid, new_piece)) return new_piece; - - new_piece.col -= 1; - if (!checkCollision(grid, new_piece)) return new_piece; - + if ((prev_stage == Piece.RotStage.init and next_stage == Piece.RotStage.right) or (prev_stage == Piece.RotStage.left and next_stage == Piece.RotStage.flip)) { + offsets = .{ .{ -2, 0 }, .{ 1, 0 }, .{ -2, 1 }, .{ 1, -2 } }; + } else if ((prev_stage == Piece.RotStage.right and next_stage == Piece.RotStage.init) or (prev_stage == Piece.RotStage.flip and next_stage == Piece.RotStage.left)) { + offsets = .{ .{ 2, 0 }, .{ -1, 0 }, .{ 2, -1 }, .{ -1, 2 } }; + } else if ((prev_stage == Piece.RotStage.right and next_stage == Piece.RotStage.flip) or (prev_stage == Piece.RotStage.init and next_stage == Piece.RotStage.left)) { + offsets = .{ .{ -1, 0 }, .{ 2, 0 }, .{ -1, -2 }, .{ 2, 1 } }; + } else { + offsets = .{ .{ 1, 0 }, .{ -2, 0 }, .{ 1, 2 }, .{ -2, -1 } }; + } } else { - if (!checkCollision(grid, new_piece)) return new_piece; - - new_piece.col += 1; - if (!checkCollision(grid, new_piece)) return new_piece; - - new_piece.row += 1; - if (!checkCollision(grid, new_piece)) return new_piece; - - new_piece.col -= 1; - new_piece.row -= 3; - if (!checkCollision(grid, new_piece)) return new_piece; - - new_piece.col += 1; - if (!checkCollision(grid, new_piece)) return new_piece; + if ((prev_stage == Piece.RotStage.init and next_stage == Piece.RotStage.right) or (prev_stage == Piece.RotStage.flip and next_stage == Piece.RotStage.right)) { + offsets = .{ .{ -1, 0 }, .{ -1, -1 }, .{ 0, 2 }, .{ -1, 2 } }; + } else if ((prev_stage == Piece.RotStage.right and next_stage == Piece.RotStage.init) or (prev_stage == Piece.RotStage.right and next_stage == Piece.RotStage.flip)) { + offsets = .{ .{ 1, 0 }, .{ 1, 1 }, .{ 0, -2 }, .{ 1, -2 } }; + } else if ((prev_stage == Piece.RotStage.flip and next_stage == Piece.RotStage.left) or (prev_stage == Piece.RotStage.init and next_stage == Piece.RotStage.left)) { + offsets = .{ .{ 1, 0 }, .{ 1, -1 }, .{ 0, 2 }, .{ 1, 2 } }; + } else { + offsets = .{ .{ -1, 0 }, .{ -1, 1 }, .{ 0, -2 }, .{ -1, -2 } }; + } } + + // Try offsets + + for (offsets) |offset| { + new_piece.col += offset[0]; + new_piece.row += offset[1]; + if (!checkCollision(grid, new_piece)) return new_piece; + new_piece.col -= offset[0]; + new_piece.row -= offset[1]; + } + return prev_piece; } diff --git a/zig-cache/h/8fb74d559dd889eac55495e9f1d9dc64.txt b/zig-cache/h/8fb74d559dd889eac55495e9f1d9dc64.txt index fd69f67..6944dc4 100644 --- a/zig-cache/h/8fb74d559dd889eac55495e9f1d9dc64.txt +++ b/zig-cache/h/8fb74d559dd889eac55495e9f1d9dc64.txt @@ -1,7 +1,7 @@ 1361 36569768 1657038271710135652 e361ab3d1987688681b5db7b52fd5cba /home/strange/Documentos/Projectes/Programació/usg/src/main.zig 1361 36569768 1657038271710135652 e361ab3d1987688681b5db7b52fd5cba /home/strange/Documentos/Projectes/Programació/usg/src/main.zig 135300 36570392 1655299923670057346 b4c2d851673df5aab566633b89bdaa84 /home/strange/Documentos/Projectes/Programació/usg/lib/SDL.zig/src/binding/sdl.zig -32 36570080 1657065821400339134 91a8da097c7c1645ba2a6217a5171c4e /home/strange/Documentos/Projectes/Programació/usg/zig-cache/options/kh59p23UXKId3bWMadeQ0Yp6cv2kATA4qPk2nBQ2q_3IsG9JTjKRYS1YxdIMHL6s +32 36570080 1657107000090054032 91a8da097c7c1645ba2a6217a5171c4e /home/strange/Documentos/Projectes/Programació/usg/zig-cache/options/kh59p23UXKId3bWMadeQ0Yp6cv2kATA4qPk2nBQ2q_3IsG9JTjKRYS1YxdIMHL6s 5621 36968525 1655270162000000000 66001e1a55f68e4681c1f32a69223647 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/std.zig 5621 36968525 1655270162000000000 66001e1a55f68e4681c1f32a69223647 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/std.zig 29901 36968437 1655270162000000000 5c441d88acbf5e7fe2a26137df2b5376 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/builtin.zig @@ -21,7 +21,7 @@ 121502 36968568 1655270162000000000 4bad05f05e4a10364e515a13d2fa2b3f /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/os/linux/io_uring.zig 135300 36570392 1655299923670057346 b4c2d851673df5aab566633b89bdaa84 /home/strange/Documentos/Projectes/Programació/usg/lib/SDL.zig/src/binding/sdl.zig 1640 36570393 1655299923670057346 c3d50ea43c9e10688a521a9ac927ded4 /home/strange/Documentos/Projectes/Programació/usg/lib/SDL.zig/src/binding/sdl_image.zig -32 36570080 1657065821400339134 91a8da097c7c1645ba2a6217a5171c4e /home/strange/Documentos/Projectes/Programació/usg/zig-cache/options/kh59p23UXKId3bWMadeQ0Yp6cv2kATA4qPk2nBQ2q_3IsG9JTjKRYS1YxdIMHL6s +32 36570080 1657107000090054032 91a8da097c7c1645ba2a6217a5171c4e /home/strange/Documentos/Projectes/Programació/usg/zig-cache/options/kh59p23UXKId3bWMadeQ0Yp6cv2kATA4qPk2nBQ2q_3IsG9JTjKRYS1YxdIMHL6s 7338 36968289 1655270162000000000 ee4fd6c02929ff52d99a8faa2539dce8 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/zig.zig 21121 36968483 1655270162000000000 669c911cf26ce07c5f5516d896b30e33 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/zig/c_translation.zig 113573 36968636 1655270162000000000 2c3980264c753ba754322c7c8c4f2634 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/mem.zig @@ -40,7 +40,7 @@ 9352 36968413 1655270162000000000 8c526bbafa435d2af666b490a1e838ad /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/Thread/Mutex.zig 3400 36968452 1655270162000000000 5d1d518c32f4fd700943417f56120125 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/io/writer.zig 41490 36968415 1655270162000000000 f3d5b2d6057676d8866cf9291ef27dee /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/Thread/Futex.zig -4491 36569862 1657065820400339127 9a2d44189292dcdacdca08c75c5b78ec /home/strange/Documentos/Projectes/Programació/usg/src/movement.zig +5108 36569824 1657106993040053980 07f1cbc47513104f7aaefa9a2df0de9b /home/strange/Documentos/Projectes/Programació/usg/src/movement.zig 1287 36569807 1657025367450040341 019ede768d3bb377ce293523ab6255bf /home/strange/Documentos/Projectes/Programació/usg/src/renderer.zig 102705 36968384 1655270162000000000 4896646ce9abce74b86bcbbc275a18c1 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/fmt.zig 31107 36968497 1655270162000000000 efe5272d00145b6eca03d42fcf5fcd30 /home/strange/Documentos/Projectes/Programació/usg/zig/lib/std/mem/Allocator.zig diff --git a/zig-cache/z/15c879599ff43bd66fcf3641638f0aa9 b/zig-cache/z/15c879599ff43bd66fcf3641638f0aa9 index f167e6666656062203503dbdee63b1e7ab0d391c..ad208b302ad43ccbc4d0b8a5b25fdb7cc44f59b0 100644 GIT binary patch literal 23536 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