87 lines
2.0 KiB
Lua
87 lines
2.0 KiB
Lua
-- thanks Adventium_ for heavily un-spaghetti-ing this code
|
|
|
|
local Ruleset = require 'tetris.rulesets.ruleset'
|
|
local Piece = require 'tetris.components.piece'
|
|
|
|
local RandomPieces = Ruleset:extend()
|
|
|
|
RandomPieces.name = "Random Pieces"
|
|
RandomPieces.hash = "RandomPieces"
|
|
|
|
function RandomPieces:generateBlockOffsets()
|
|
function containsPoint(points, p)
|
|
for _, point in pairs(points) do
|
|
if point.x == p.x and point.y == p.y then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local offsets = {}
|
|
for i = 1, 4 do
|
|
local generated_offset = {}
|
|
repeat
|
|
generated_offset = {
|
|
x = math.random(-1, 1),
|
|
y = math.random(-2, 0)
|
|
}
|
|
until not containsPoint(offsets, generated_offset)
|
|
offsets[i] = generated_offset
|
|
end
|
|
|
|
return { { offsets, offsets, offsets, offsets } }
|
|
end
|
|
|
|
RandomPieces.spawn_positions = {
|
|
{ x=4, y=5 }
|
|
}
|
|
|
|
RandomPieces.big_spawn_positions = {
|
|
{ x=2, y=3 }
|
|
}
|
|
|
|
RandomPieces.next_sounds = {
|
|
"O"
|
|
}
|
|
|
|
RandomPieces.colourscheme = {
|
|
"W"
|
|
}
|
|
|
|
RandomPieces.block_offsets = {
|
|
{
|
|
{ {x=0, y=0} },
|
|
{ {x=0, y=0} },
|
|
{ {x=0, y=0} },
|
|
{ {x=0, y=0} },
|
|
}
|
|
}
|
|
|
|
function RandomPieces:onPieceCreate(piece)
|
|
piece.block_offsets = RandomPieces.generateBlockOffsets()
|
|
end
|
|
|
|
function RandomPieces:attemptRotate(new_inputs, piece, grid, initial)
|
|
if not (
|
|
new_inputs.rotate_left or new_inputs.rotate_left2 or
|
|
new_inputs.rotate_right or new_inputs.rotate_right2 or
|
|
new_inputs.rotate_180
|
|
) then
|
|
return
|
|
end
|
|
|
|
local new_piece = piece:withOffset({x=0, y=0})
|
|
new_piece.block_offsets = RandomPieces.generateBlockOffsets()
|
|
|
|
if (grid:canPlacePiece(new_piece)) then
|
|
piece.block_offsets = new_piece.block_offsets
|
|
self:onPieceRotate(piece, grid)
|
|
end
|
|
end
|
|
|
|
function RandomPieces:onPieceDrop(piece) piece.lock_delay = 0 end
|
|
function RandomPieces:onPieceMove(piece) piece.lock_delay = 0 end
|
|
function RandomPieces:onPieceRotate(piece) piece.lock_delay = 0 end
|
|
|
|
return RandomPieces |