From 30ca43402702befc26a6581a6d9aa3234b00042a Mon Sep 17 00:00:00 2001 From: Ishaan Bhardwaj Date: Sun, 7 Mar 2021 22:24:11 -0500 Subject: [PATCH] Fixed ACE-ARS to floorkick infinitely --- tetris/rulesets/arika_ace.lua | 40 +---------------- tetris/rulesets/arika_ace2.lua | 81 +++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 46 deletions(-) diff --git a/tetris/rulesets/arika_ace.lua b/tetris/rulesets/arika_ace.lua index 7a274fd..a8a1654 100755 --- a/tetris/rulesets/arika_ace.lua +++ b/tetris/rulesets/arika_ace.lua @@ -1,5 +1,5 @@ local Piece = require 'tetris.components.piece' -local Ruleset = require 'tetris.rulesets.arika_ti' +local Ruleset = require 'tetris.rulesets.arika_ace2' local ARS = Ruleset:extend() @@ -18,43 +18,5 @@ ARS.colourscheme = { ARS.softdrop_lock = false ARS.harddrop_lock = true -ARS.spawn_above_field = true - -function ARS:onPieceCreate(piece, grid) - piece.floorkick = 0 - piece.manipulations = 0 -end - -function ARS:onPieceMove(piece, grid) - piece.lock_delay = 0 -- move reset - if piece:isDropBlocked(grid) then - piece.manipulations = piece.manipulations + 1 - if piece.manipulations >= 128 then - piece:dropToBottom(grid) - piece.locked = true - end - end -end - -function ARS:onPieceRotate(piece, grid) - piece.lock_delay = 0 -- rotate reset - if piece:isDropBlocked(grid) then - piece.manipulations = piece.manipulations + 1 - if piece.manipulations >= 128 then - piece:dropToBottom(grid) - piece.locked = true - end - end - if piece.floorkick >= 1 then - piece.floorkick = piece.floorkick + 1 - if piece:isDropBlocked(grid) then - piece.locked = true - end - end -end - -function ARS:get180RotationValue() return 3 end - -function ARS:getDefaultOrientation() return 3 end -- downward facing pieces by default return ARS diff --git a/tetris/rulesets/arika_ace2.lua b/tetris/rulesets/arika_ace2.lua index f2d2f8f..1bec39c 100644 --- a/tetris/rulesets/arika_ace2.lua +++ b/tetris/rulesets/arika_ace2.lua @@ -7,11 +7,84 @@ ARS.name = "ACE-ARS2" ARS.hash = "ArikaACE2" ARS.spawn_above_field = true +function ARS:attemptWallkicks(piece, new_piece, rot_dir, grid) + + -- O doesn't kick + if (piece.shape == "O") then return end + + -- center column rule + if ( + piece.shape == "J" or piece.shape == "T" or piece.shape == "L" + ) and ( + piece.rotation == 0 or piece.rotation == 2 + ) then + local offsets = new_piece:getBlockOffsets() + table.sort(offsets, function(A, B) return A.y < B.y or A.y == B.y and A.x < B.y end) + for index, offset in pairs(offsets) do + if grid:isOccupied(piece.position.x + offset.x, piece.position.y + offset.y) then + if offset.x == 0 then + return + else + break + end + end + end + end + + if piece.shape == "I" then + -- special kick rules for I + if (new_piece.rotation == 0 or new_piece.rotation == 2) and + (piece:isMoveBlocked(grid, {x=-1, y=0}) or piece:isMoveBlocked(grid, {x=1, y=0})) then + -- kick right, right2, left + if grid:canPlacePiece(new_piece:withOffset({x=1, y=0})) then + self:onPieceRotate(piece, grid) + piece:setRelativeRotation(rot_dir):setOffset({x=1, y=0}) + elseif grid:canPlacePiece(new_piece:withOffset({x=2, y=0})) then + self:onPieceRotate(piece, grid) + piece:setRelativeRotation(rot_dir):setOffset({x=2, y=0}) + elseif grid:canPlacePiece(new_piece:withOffset({x=-1, y=0})) then + self:onPieceRotate(piece, grid) + piece:setRelativeRotation(rot_dir):setOffset({x=-1, y=0}) + end + elseif piece:isDropBlocked(grid) and (new_piece.rotation == 1 or new_piece.rotation == 3) then + -- kick up, up2 + if grid:canPlacePiece(new_piece:withOffset({x=0, y=-1})) then + self:onPieceRotate(piece, grid) + piece:setRelativeRotation(rot_dir):setOffset({x=0, y=-1}) + elseif grid:canPlacePiece(new_piece:withOffset({x=0, y=-2})) then + self:onPieceRotate(piece, grid) + piece:setRelativeRotation(rot_dir):setOffset({x=0, y=-2}) + end + end + else + -- kick right, kick left + if grid:canPlacePiece(new_piece:withOffset({x=1, y=0})) then + self:onPieceRotate(piece, grid) + piece:setRelativeRotation(rot_dir):setOffset({x=1, y=0}) + elseif grid:canPlacePiece(new_piece:withOffset({x=-1, y=0})) then + self:onPieceRotate(piece, grid) + piece:setRelativeRotation(rot_dir):setOffset({x=-1, y=0}) + elseif piece.shape == "T" + and new_piece.rotation == 0 + and piece:isDropBlocked(grid) + and grid:canPlacePiece(new_piece:withOffset({x=0, y=-1})) + then + -- T floorkick + self:onPieceRotate(piece, grid) + piece:setRelativeRotation(rot_dir):setOffset({x=0, y=-1}) + end + end + +end + function ARS:onPieceCreate(piece, grid) - piece.floorkick = 0 piece.manipulations = 0 end +function ARS:onPieceDrop(piece, grid) + piece.lock_delay = 0 +end + function ARS:onPieceMove(piece, grid) piece.lock_delay = 0 -- move reset if piece:isDropBlocked(grid) then @@ -32,12 +105,6 @@ function ARS:onPieceRotate(piece, grid) piece.locked = true end end - if piece.floorkick >= 1 then - piece.floorkick = piece.floorkick + 1 - if piece:isDropBlocked(grid) then - piece.locked = true - end - end end function ARS:get180RotationValue() return 3 end