mirror of
https://github.com/SashLilac/cambridge-modpack.git
synced 2024-11-22 16:59:03 -06:00
PAIRS moved to modpack, Race 40 moved to game
Duality A1, KRS, Texy-World added
This commit is contained in:
parent
303e844608
commit
fa23e21f9d
65
tetris/modes/duality_a1.lua
Normal file
65
tetris/modes/duality_a1.lua
Normal file
@ -0,0 +1,65 @@
|
||||
local MarathonA1Game = require 'tetris.modes.marathon_a1'
|
||||
local Grid = require 'tetris.components.grid'
|
||||
local SplitHistoryRandomizer = require 'tetris.randomizers.split_history'
|
||||
|
||||
local DualityA1Game = MarathonA1Game:extend()
|
||||
|
||||
DualityA1Game.name = "Duality A1"
|
||||
DualityA1Game.hash = "DualityA1"
|
||||
DualityA1Game.tagline = "Control two boards at once!"
|
||||
|
||||
function DualityA1Game:new()
|
||||
DualityA1Game.super:new()
|
||||
self.randomizer = SplitHistoryRandomizer()
|
||||
self.other_grid = Grid(10, 24)
|
||||
self.next_queue_length = 2
|
||||
end
|
||||
|
||||
function DualityA1Game:updateScore(level, drop_bonus, cleared_lines)
|
||||
if not self.clear then
|
||||
if self.grid:checkForBravo(cleared_lines) then
|
||||
self.bravo = 4
|
||||
self.bravos = self.bravos + 1
|
||||
else self.bravo = 1 end
|
||||
if cleared_lines > 0 then
|
||||
self.combo = self.combo + (cleared_lines - 1) * 2
|
||||
self.score = self.score + (
|
||||
(math.ceil((level + cleared_lines) / 4) + drop_bonus) *
|
||||
cleared_lines * self.combo * self.bravo
|
||||
)
|
||||
else
|
||||
self.combo = 1
|
||||
end
|
||||
self.drop_bonus = 0
|
||||
end
|
||||
if cleared_lines ~= 0 then return end
|
||||
self.grid, self.other_grid = self.other_grid, self.grid
|
||||
end
|
||||
|
||||
function DualityA1Game:afterLineClear(cleared_row_count)
|
||||
self.grid, self.other_grid = self.other_grid, self.grid
|
||||
end
|
||||
|
||||
local function fadeOut(game, block, x, y, age)
|
||||
local opacity = (game.are - (game:getARE() / 2)) / (game:getARE() / 2)
|
||||
return 0.5, 0.5, 0.5, opacity, opacity
|
||||
end
|
||||
|
||||
local function fadeIn(game, block, x, y, age)
|
||||
local opacity = (game.are - (game:getARE() / 2)) / (game:getARE() / 2)
|
||||
return 0.5, 0.5, 0.5, 1 - opacity, 1 - opacity
|
||||
end
|
||||
|
||||
function DualityA1Game:drawGrid()
|
||||
if self.lcd == 0 and self.are > 0 then
|
||||
self.grid:drawCustom(fadeIn, self)
|
||||
self.other_grid:drawCustom(fadeOut, self)
|
||||
else
|
||||
self.grid:draw()
|
||||
end
|
||||
if self.piece ~= nil and self.level < 100 then
|
||||
self:drawGhostPiece()
|
||||
end
|
||||
end
|
||||
|
||||
return DualityA1Game
|
40
tetris/randomizers/split_history.lua
Normal file
40
tetris/randomizers/split_history.lua
Normal file
@ -0,0 +1,40 @@
|
||||
local Randomizer = require 'tetris.randomizers.randomizer'
|
||||
|
||||
local SplitHistoryRandomizer = Randomizer:extend()
|
||||
|
||||
function SplitHistoryRandomizer:initialize()
|
||||
self.history = {"Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z"}
|
||||
self.piece_count = 0
|
||||
end
|
||||
|
||||
function SplitHistoryRandomizer:generatePiece()
|
||||
if self.piece_count < 2 then
|
||||
self.piece_count = self.piece_count + 1
|
||||
return self:updateHistory(({"L", "J", "I", "T"})[math.random(4)])
|
||||
else
|
||||
local shapes = {"I", "J", "L", "O", "S", "T", "Z"}
|
||||
for i = 1, 4 do
|
||||
local x = math.random(7)
|
||||
if not inHistory(shapes[x], self.history) or i == 4 then
|
||||
return self:updateHistory(shapes[x])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SplitHistoryRandomizer:updateHistory(shape)
|
||||
table.remove(self.history, 1)
|
||||
table.insert(self.history, shape)
|
||||
return shape
|
||||
end
|
||||
|
||||
function inHistory(piece, history)
|
||||
for i = 1, 7, 2 do
|
||||
if history[i] == piece then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
return SplitHistoryRandomizer
|
184
tetris/rulesets/krs.lua
Normal file
184
tetris/rulesets/krs.lua
Normal file
@ -0,0 +1,184 @@
|
||||
local SRS = require 'tetris.rulesets.ti_srs'
|
||||
|
||||
local KRS = SRS:extend()
|
||||
|
||||
KRS.name = "K.R.S."
|
||||
KRS.hash = "KRS"
|
||||
|
||||
KRS.wallkicks_3x3 = {
|
||||
[0]={
|
||||
[1]={{-1,0},{-1,-1}},
|
||||
[2]={{0,-1},{0,-2}},
|
||||
[3]={{1,0},{1,-1}},
|
||||
},
|
||||
[1]={
|
||||
[0]={{1,0},{1,1}},
|
||||
[2]={{1,0},{1,-1}},
|
||||
[3]={{2,0}},
|
||||
},
|
||||
[2]={
|
||||
[0]={{0,1},{0,2}},
|
||||
[1]={{-1,0},{-1,1}},
|
||||
[3]={{1,0},{1,1}},
|
||||
},
|
||||
[3]={
|
||||
[0]={{-1,0},{-1,1}},
|
||||
[1]={{-2,0}},
|
||||
[2]={{-1,0},{-1,-1}},
|
||||
},
|
||||
}
|
||||
|
||||
KRS.wallkicks_line = {
|
||||
[0]={
|
||||
[1]={{-1,0},{-1,-1},{1,0},{1,1}},
|
||||
[2]={{0,-1},{0,-2}},
|
||||
[3]={{1,0},{1,-1},{-1,0},{-1,1}},
|
||||
},
|
||||
[1]={
|
||||
[0]={{1,0},{1,1},{-1,0},{-1,-1}},
|
||||
[2]={{1,0},{1,-1},{-1,0},{-1,1}},
|
||||
[3]={{2,0}},
|
||||
},
|
||||
[2]={
|
||||
[0]={{0,1},{0,2}},
|
||||
[1]={{-1,0},{-1,1},{1,0},{1,-1}},
|
||||
[3]={{1,0},{1,1},{-1,0},{-1,-1}},
|
||||
},
|
||||
[3]={
|
||||
[0]={{-1,0},{-1,1},{1,0},{1,-1}},
|
||||
[1]={{-2,0}},
|
||||
[2]={{-1,0},{-1,-1},{1,0},{1,1}},
|
||||
},
|
||||
}
|
||||
|
||||
function KRS:onPieceCreate(piece)
|
||||
piece.das_kicked = false
|
||||
piece.recovery_frames = self.game:getLockDelay() * 15
|
||||
end
|
||||
|
||||
function KRS:onPieceDrop() end
|
||||
|
||||
function KRS:onPieceMove(piece)
|
||||
while piece.lock_delay > 0 and piece.recovery_frames > 0 do
|
||||
piece.recovery_frames = piece.recovery_frames - 1
|
||||
piece.lock_delay = piece.lock_delay - 1
|
||||
end
|
||||
end
|
||||
|
||||
function KRS:onPieceRotate(piece)
|
||||
while piece.lock_delay > 0 and piece.recovery_frames > 0 do
|
||||
piece.recovery_frames = piece.recovery_frames - 1
|
||||
piece.lock_delay = piece.lock_delay - 1
|
||||
end
|
||||
end
|
||||
|
||||
function KRS:canPieceMove(piece)
|
||||
return not piece.das_kicked
|
||||
end
|
||||
|
||||
function KRS:canPieceRotate(piece) return true end
|
||||
|
||||
function KRS:attemptRotate(new_inputs, piece, grid, initial)
|
||||
piece.das_kicked = false
|
||||
|
||||
local rot_dir = 0
|
||||
|
||||
if (new_inputs["rotate_left"] or new_inputs["rotate_left2"]) then
|
||||
rot_dir = 3
|
||||
elseif (new_inputs["rotate_right"] or new_inputs["rotate_right2"]) then
|
||||
rot_dir = 1
|
||||
elseif (new_inputs["rotate_180"]) then
|
||||
rot_dir = self:get180RotationValue()
|
||||
end
|
||||
|
||||
if rot_dir == 0 then return end
|
||||
if config.gamesettings.world_reverse == 3 or (self.world and config.gamesettings.world_reverse == 2) then
|
||||
rot_dir = 4 - rot_dir
|
||||
end
|
||||
|
||||
local new_piece = piece:withRelativeRotation(rot_dir)
|
||||
|
||||
if initial then
|
||||
if grid:canPlacePiece(new_piece) then
|
||||
piece:setRelativeRotation(rot_dir)
|
||||
self:onPieceRotate(piece)
|
||||
end
|
||||
else
|
||||
self:attemptWallkicks(piece, new_piece, rot_dir, grid, new_inputs)
|
||||
end
|
||||
end
|
||||
|
||||
function KRS:attemptWallkicks(piece, new_piece, rot_dir, grid, new_inputs)
|
||||
local kicks = (
|
||||
piece.shape == "I" and
|
||||
KRS.wallkicks_line[piece.rotation][new_piece.rotation] or
|
||||
KRS.wallkicks_3x3[piece.rotation][new_piece.rotation]
|
||||
)
|
||||
local priority = 0
|
||||
if (
|
||||
(new_inputs["left"]) or
|
||||
(
|
||||
self.game.das.direction == "left" and
|
||||
(
|
||||
self.game.das.frames >= self.game:getDasLimit() - self.game:getARR() or
|
||||
piece:isMoveBlocked(grid, {x=-1, y=0})
|
||||
)
|
||||
)
|
||||
) then
|
||||
priority = -1
|
||||
elseif (
|
||||
(new_inputs["right"]) or
|
||||
(
|
||||
self.game.das.direction == "right" and
|
||||
(
|
||||
self.game.das.frames >= self.game:getDasLimit() - self.game:getARR() or
|
||||
piece:isMoveBlocked(grid, {x=1, y=0})
|
||||
)
|
||||
)
|
||||
) then
|
||||
priority = 1
|
||||
end
|
||||
|
||||
-- base rotation with offset
|
||||
if grid:canPlacePiece(new_piece:withOffset({x=priority, y=0})) then
|
||||
piece:setRelativeRotation(rot_dir)
|
||||
piece:setOffset({x=priority, y=0})
|
||||
self:onPieceRotate(piece)
|
||||
piece.das_kicked = true
|
||||
return
|
||||
end
|
||||
|
||||
-- das kicks
|
||||
for idx, offset in pairs(kicks) do
|
||||
kicked_piece = new_piece:withOffset({x=offset[1]+priority, y=offset[2]})
|
||||
if grid:canPlacePiece(kicked_piece) then
|
||||
piece:setRelativeRotation(rot_dir)
|
||||
piece:setOffset({x=offset[1]+priority, y=offset[2]})
|
||||
self:onPieceRotate(piece)
|
||||
piece.das_kicked = true
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- base rotation
|
||||
if grid:canPlacePiece(new_piece) then
|
||||
piece:setRelativeRotation(rot_dir)
|
||||
self:onPieceRotate(piece)
|
||||
return
|
||||
end
|
||||
|
||||
-- regular kicks
|
||||
for idx, offset in pairs(kicks) do
|
||||
kicked_piece = new_piece:withOffset({x=offset[1], y=offset[2]})
|
||||
if grid:canPlacePiece(kicked_piece) then
|
||||
piece:setRelativeRotation(rot_dir)
|
||||
piece:setOffset({x=offset[1], y=offset[2]})
|
||||
self:onPieceRotate(piece)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function KRS:get180RotationValue() return 2 end
|
||||
|
||||
return KRS
|
258
tetris/rulesets/pairs.lua
Normal file
258
tetris/rulesets/pairs.lua
Normal file
@ -0,0 +1,258 @@
|
||||
local Ruleset = require 'tetris.rulesets.ruleset'
|
||||
|
||||
local PAIRS = Ruleset:extend()
|
||||
|
||||
PAIRS.name = "PAIRS"
|
||||
PAIRS.hash = "PAIRS"
|
||||
PAIRS.world = true
|
||||
|
||||
PAIRS.spawn_positions = {
|
||||
[1] = { x=4, y=4 },
|
||||
[2] = { x=4, y=5 },
|
||||
[3] = { x=4, y=5 },
|
||||
[4] = { x=4, y=5 },
|
||||
[5] = { x=5, y=5 },
|
||||
[6] = { x=5, y=5 },
|
||||
[7] = { x=5, y=5 },
|
||||
[8] = { x=5, y=5 },
|
||||
[9] = { x=5, y=5 },
|
||||
[10] = { x=5, y=5 },
|
||||
[11] = { x=4, y=5 },
|
||||
[12] = { x=4, y=5 },
|
||||
[13] = { x=4, y=5 },
|
||||
[14] = { x=4, y=5 },
|
||||
[15] = { x=4, y=5 },
|
||||
[16] = { x=4, y=5 },
|
||||
[17] = { x=4, y=5 },
|
||||
[18] = { x=4, y=5 },
|
||||
}
|
||||
|
||||
PAIRS.big_spawn_positions = {
|
||||
[1] = { x=2, y=2 },
|
||||
[2] = { x=2, y=3 },
|
||||
[3] = { x=2, y=3 },
|
||||
[4] = { x=2, y=3 },
|
||||
[5] = { x=3, y=3 },
|
||||
[6] = { x=3, y=3 },
|
||||
[7] = { x=3, y=3 },
|
||||
[8] = { x=3, y=3 },
|
||||
[9] = { x=3, y=3 },
|
||||
[10] = { x=3, y=3 },
|
||||
[11] = { x=2, y=3 },
|
||||
[12] = { x=2, y=3 },
|
||||
[13] = { x=2, y=3 },
|
||||
[14] = { x=2, y=3 },
|
||||
[15] = { x=2, y=3 },
|
||||
[16] = { x=2, y=3 },
|
||||
[17] = { x=2, y=3 },
|
||||
[18] = { x=2, y=3 },
|
||||
}
|
||||
|
||||
PAIRS.next_sounds = {
|
||||
[1] = "I",
|
||||
[2] = "O",
|
||||
[3] = "S",
|
||||
[4] = "Z",
|
||||
[5] = "L",
|
||||
[6] = "J",
|
||||
[7] = "Z",
|
||||
[8] = "S",
|
||||
[9] = "J",
|
||||
[10] = "L",
|
||||
[11] = "O",
|
||||
[12] = "O",
|
||||
[13] = "T",
|
||||
[14] = "L",
|
||||
[15] = "J",
|
||||
[16] = "T",
|
||||
[17] = "J",
|
||||
[18] = "I"
|
||||
}
|
||||
|
||||
PAIRS.colourscheme = {
|
||||
[1] = "R",
|
||||
[2] = "C",
|
||||
[3] = "G",
|
||||
[4] = "M",
|
||||
[5] = "O",
|
||||
[6] = "C",
|
||||
[7] = "G",
|
||||
[8] = "M",
|
||||
[9] = "G",
|
||||
[10] = "M",
|
||||
[11] = "Y",
|
||||
[12] = "B",
|
||||
[13] = "M",
|
||||
[14] = "O",
|
||||
[15] = "B",
|
||||
[16] = "G",
|
||||
[17] = "C",
|
||||
[18] = "R"
|
||||
}
|
||||
|
||||
PAIRS.pieces = 18
|
||||
|
||||
PAIRS.block_offsets = {
|
||||
[1]={
|
||||
{ {x=-2, y=0}, {x=-1, y=0}, {x=0, y=0}, {x=1, y=0}, {x=2, y=0} },
|
||||
{ {x=0, y=-2}, {x=0, y=-1}, {x=0, y=0}, {x=0, y=1}, {x=0, y=2} },
|
||||
{ {x=-2, y=0}, {x=-1, y=0}, {x=0, y=0}, {x=1, y=0}, {x=2, y=0} },
|
||||
{ {x=0, y=-2}, {x=0, y=-1}, {x=0, y=0}, {x=0, y=1}, {x=0, y=2} },
|
||||
},
|
||||
[2]={
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=-1}, {x=-1, y=-1} },
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=-1}, {x=-1, y=-1} },
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=-1}, {x=-1, y=-1} },
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=-1}, {x=-1, y=-1} },
|
||||
},
|
||||
[3]={
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=-2}, {x=-1, y=0} },
|
||||
{ {x=0, y=-1}, {x=-1, y=-1}, {x=1, y=-1}, {x=1, y=0}, {x=-1, y=-2} },
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=-2}, {x=-1, y=0} },
|
||||
{ {x=0, y=-1}, {x=-1, y=-1}, {x=1, y=-1}, {x=1, y=0}, {x=-1, y=-2} },
|
||||
},
|
||||
[4]={
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=0}, {x=-1, y=-2} },
|
||||
{ {x=0, y=-1}, {x=-1, y=-1}, {x=1, y=-1}, {x=-1, y=0}, {x=1, y=-2} },
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=0}, {x=-1, y=-2} },
|
||||
{ {x=0, y=-1}, {x=-1, y=-1}, {x=1, y=-1}, {x=-1, y=0}, {x=1, y=-2} },
|
||||
},
|
||||
[5]={
|
||||
{ {x=1, y=-1}, {x=-2, y=0}, {x=-1, y=0}, {x=0, y=0}, {x=1, y=0} },
|
||||
{ {x=0, y=0}, {x=-1, y=-3}, {x=-1, y=-2}, {x=-1, y=-1}, {x=-1, y=0} },
|
||||
{ {x=-2, y=0}, {x=-2, y=-1}, {x=-1, y=-1}, {x=0, y=-1}, {x=1, y=-1} },
|
||||
{ {x=-1, y=-3}, {x=0, y=-3}, {x=0, y=-2}, {x=0, y=-1}, {x=0, y=0} },
|
||||
},
|
||||
[6]={
|
||||
{ {x=-2, y=-1}, {x=-2, y=0}, {x=-1, y=0}, {x=0, y=0}, {x=1, y=0} },
|
||||
{ {x=0, y=-3}, {x=-1, y=-3}, {x=-1, y=-2}, {x=-1, y=-1}, {x=-1, y=0} },
|
||||
{ {x=1, y=0}, {x=-2, y=-1}, {x=-1, y=-1}, {x=0, y=-1}, {x=1, y=-1} },
|
||||
{ {x=-1, y=0}, {x=0, y=-3}, {x=0, y=-2}, {x=0, y=-1}, {x=0, y=0} },
|
||||
},
|
||||
[7]={
|
||||
{ {x=-2, y=-1}, {x=-1, y=-1}, {x=-1, y=0}, {x=0, y=0}, {x=1, y=0} },
|
||||
{ {x=0, y=-3}, {x=0, y=-2}, {x=-1, y=-2}, {x=-1, y=-1}, {x=-1, y=0} },
|
||||
{ {x=-2, y=-1}, {x=-1, y=-1}, {x=0, y=-1}, {x=0, y=0}, {x=1, y=0} },
|
||||
{ {x=-1, y=0}, {x=0, y=-3}, {x=0, y=-2}, {x=0, y=-1}, {x=-1, y=-1} },
|
||||
},
|
||||
[8]={
|
||||
{ {x=1, y=-1}, {x=-2, y=0}, {x=-1, y=0}, {x=0, y=0}, {x=0, y=-1} },
|
||||
{ {x=0, y=0}, {x=-1, y=-3}, {x=-1, y=-2}, {x=-1, y=-1}, {x=0, y=-1} },
|
||||
{ {x=-2, y=0}, {x=-1, y=0}, {x=-1, y=-1}, {x=0, y=-1}, {x=1, y=-1} },
|
||||
{ {x=-1, y=-3}, {x=-1, y=-2}, {x=0, y=-2}, {x=0, y=-1}, {x=0, y=0} },
|
||||
},
|
||||
[9]={
|
||||
{ {x=-1, y=-1}, {x=-2, y=0}, {x=-1, y=0}, {x=0, y=0}, {x=1, y=0} },
|
||||
{ {x=0, y=-2}, {x=-1, y=-3}, {x=-1, y=-2}, {x=-1, y=-1}, {x=-1, y=0} },
|
||||
{ {x=0, y=0}, {x=-2, y=-1}, {x=-1, y=-1}, {x=0, y=-1}, {x=1, y=-1} },
|
||||
{ {x=-1, y=-1}, {x=0, y=-3}, {x=0, y=-2}, {x=0, y=-1}, {x=0, y=0} },
|
||||
},
|
||||
[10]={
|
||||
{ {x=0, y=-1}, {x=-2, y=0}, {x=-1, y=0}, {x=0, y=0}, {x=1, y=0} },
|
||||
{ {x=0, y=-1}, {x=-1, y=-3}, {x=-1, y=-2}, {x=-1, y=-1}, {x=-1, y=0} },
|
||||
{ {x=-1, y=0}, {x=-2, y=-1}, {x=-1, y=-1}, {x=0, y=-1}, {x=1, y=-1} },
|
||||
{ {x=-1, y=-2}, {x=0, y=-3}, {x=0, y=-2}, {x=0, y=-1}, {x=0, y=0} },
|
||||
},
|
||||
[11]={
|
||||
{ {x=0, y=0}, {x=-1, y=0}, {x=1, y=0}, {x=0, y=-1}, {x=-1, y=-1} },
|
||||
{ {x=0, y=0}, {x=0, y=-1}, {x=0, y=-2}, {x=1, y=-1}, {x=1, y=-2} },
|
||||
{ {x=0, y=0}, {x=1, y=-1}, {x=1, y=0}, {x=0, y=-1}, {x=-1, y=-1} },
|
||||
{ {x=0, y=0}, {x=0, y=-1}, {x=0, y=-2}, {x=-1, y=-1}, {x=-1, y=0} },
|
||||
},
|
||||
[12]={
|
||||
{ {x=0, y=0}, {x=1, y=-1}, {x=1, y=0}, {x=0, y=-1}, {x=-1, y=0} },
|
||||
{ {x=0, y=0}, {x=0, y=-1}, {x=0, y=-2}, {x=1, y=-1}, {x=1, y=0} },
|
||||
{ {x=0, y=0}, {x=-1, y=0}, {x=1, y=-1}, {x=0, y=-1}, {x=-1, y=-1} },
|
||||
{ {x=0, y=0}, {x=0, y=-1}, {x=0, y=-2}, {x=-1, y=-1}, {x=-1, y=-2} },
|
||||
},
|
||||
[13]={
|
||||
{ {x=0, y=0}, {x=-1, y=0}, {x=1, y=0}, {x=-1, y=-1}, {x=1, y=-1} },
|
||||
{ {x=0, y=0}, {x=0, y=-1}, {x=0, y=-2}, {x=1, y=0}, {x=1, y=-2} },
|
||||
{ {x=0, y=-1}, {x=-1, y=0}, {x=1, y=0}, {x=-1, y=-1}, {x=1, y=-1} },
|
||||
{ {x=0, y=0}, {x=0, y=-1}, {x=0, y=-2}, {x=-1, y=0}, {x=-1, y=-2} },
|
||||
},
|
||||
[14]={
|
||||
{ {x=0, y=-1}, {x=0, y=0}, {x=0, y=-2}, {x=-1, y=-1}, {x=1, y=0} },
|
||||
{ {x=0, y=-1}, {x=-1, y=-1}, {x=1, y=-1}, {x=0, y=-2}, {x=-1, y=0} },
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=-1}, {x=-1, y=-2} },
|
||||
{ {x=0, y=-1}, {x=1, y=-1}, {x=-1, y=-1}, {x=0, y=0}, {x=1, y=-2} },
|
||||
},
|
||||
[15]={
|
||||
{ {x=0, y=-1}, {x=0, y=0}, {x=0, y=-2}, {x=-1, y=0}, {x=1, y=-1} },
|
||||
{ {x=0, y=-1}, {x=-1, y=-1}, {x=1, y=-1}, {x=-1, y=-2}, {x=0, y=0} },
|
||||
{ {x=0, y=-1}, {x=0, y=-2}, {x=0, y=0}, {x=1, y=-2}, {x=-1, y=-1} },
|
||||
{ {x=0, y=-1}, {x=1, y=-1}, {x=-1, y=-1}, {x=1, y=0}, {x=0, y=-2} },
|
||||
},
|
||||
[16]={
|
||||
{ {x=0, y=0}, {x=0, y=-1}, {x=0, y=-2}, {x=-1, y=0}, {x=1, y=0} },
|
||||
{ {x=-1, y=0}, {x=0, y=-1}, {x=-1, y=-2}, {x=-1, y=-1}, {x=1, y=-1} },
|
||||
{ {x=0, y=0}, {x=0, y=-1}, {x=0, y=-2}, {x=-1, y=-2}, {x=1, y=-2} },
|
||||
{ {x=1, y=0}, {x=0, y=-1}, {x=1, y=-2}, {x=-1, y=-1}, {x=1, y=-1} },
|
||||
},
|
||||
[17]={
|
||||
{ {x=0, y=0}, {x=1, y=0}, {x=-1, y=0}, {x=-1, y=-1}, {x=-1, y=-2} },
|
||||
{ {x=0, y=-2}, {x=1, y=-2}, {x=-1, y=0}, {x=-1, y=-1}, {x=-1, y=-2} },
|
||||
{ {x=0, y=-2}, {x=1, y=0}, {x=-1, y=-2}, {x=1, y=-1}, {x=1, y=-2} },
|
||||
{ {x=0, y=0}, {x=1, y=0}, {x=-1, y=0}, {x=1, y=-1}, {x=1, y=-2} },
|
||||
},
|
||||
[18]={
|
||||
{ {x=1, y=0}, {x=0, y=0}, {x=0, y=-1}, {x=-1, y=-1}, {x=-1, y=-2} },
|
||||
{ {x=-1, y=0}, {x=-1, y=-1}, {x=0, y=-1}, {x=0, y=-2}, {x=1, y=-2} },
|
||||
{ {x=-1, y=-2}, {x=0, y=-2}, {x=0, y=-1}, {x=1, y=-1}, {x=1, y=0} },
|
||||
{ {x=1, y=-2}, {x=1, y=-1}, {x=0, y=-1}, {x=0, y=0}, {x=-1, y=0} },
|
||||
},
|
||||
}
|
||||
|
||||
PAIRS.wallkicks = {
|
||||
{x=1, y=0}, {x=-1, y=0}, {x=2, y=0}, {x=-2, y=0}, {x=0, y=-1}
|
||||
}
|
||||
|
||||
function PAIRS:attemptWallkicks(piece, new_piece, rot_dir, grid)
|
||||
if (piece.shape == 2) then return end
|
||||
|
||||
local kicks = PAIRS.wallkicks
|
||||
|
||||
assert(piece.rotation ~= new_piece.rotation)
|
||||
|
||||
for idx, offset in pairs(kicks) do
|
||||
kicked_piece = new_piece:withOffset(offset)
|
||||
if grid:canPlacePiece(kicked_piece) then
|
||||
self:onPieceRotate(piece, grid)
|
||||
piece:setRelativeRotation(rot_dir)
|
||||
piece:setOffset(offset)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PAIRS:checkNewLow(piece)
|
||||
for _, block in pairs(piece:getBlockOffsets()) do
|
||||
local y = piece.position.y + block.y
|
||||
if y > piece.lowest_y then
|
||||
piece.lock_delay = 0
|
||||
piece.lowest_y = y
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PAIRS:onPieceCreate(piece, grid)
|
||||
piece.lowest_y = -math.huge
|
||||
end
|
||||
|
||||
function PAIRS:onPieceDrop(piece, grid)
|
||||
self:checkNewLow(piece)
|
||||
end
|
||||
|
||||
function PAIRS:get180RotationValue()
|
||||
return 3
|
||||
end
|
||||
|
||||
function PAIRS:getAboveFieldOffset(shape, orientation)
|
||||
if shape == 1 then
|
||||
return 1
|
||||
else
|
||||
return 2
|
||||
end
|
||||
end
|
||||
|
||||
return PAIRS
|
37
tetris/rulesets/texy_world.lua
Normal file
37
tetris/rulesets/texy_world.lua
Normal file
@ -0,0 +1,37 @@
|
||||
local SRS = require 'tetris.rulesets.ti_srs'
|
||||
|
||||
local TexyWorld = SRS:extend()
|
||||
|
||||
TexyWorld.name = "Texy-World"
|
||||
TexyWorld.hash = "TexyWorld"
|
||||
|
||||
function TexyWorld:attemptWallkicks(piece, new_piece, rot_dir, grid)
|
||||
|
||||
local kicks
|
||||
if piece.shape == "O" then
|
||||
return
|
||||
elseif piece.shape == "I" then
|
||||
kicks = SRS.wallkicks_line[piece.rotation][new_piece.rotation]
|
||||
else
|
||||
kicks = SRS.wallkicks_3x3[piece.rotation][new_piece.rotation]
|
||||
end
|
||||
|
||||
assert(piece.rotation ~= new_piece.rotation)
|
||||
|
||||
for idx, temp_offset in pairs(kicks) do
|
||||
offset = {
|
||||
x=temp_offset.x*(rot_dir==3 and -1 or 1),
|
||||
y=temp_offset.y
|
||||
}
|
||||
kicked_piece = new_piece:withOffset(offset)
|
||||
if grid:canPlacePiece(kicked_piece) then
|
||||
piece:setRelativeRotation(rot_dir)
|
||||
piece:setOffset(offset)
|
||||
self:onPieceRotate(piece, grid, offset.y < 0)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return TexyWorld
|
Loading…
Reference in New Issue
Block a user