cambridge-modpack/tetris/modes/combo_challenge.lua
2021-10-17 21:17:41 -04:00

157 lines
4.1 KiB
Lua

local GameMode = require 'tetris.modes.gamemode'
local Grid = require 'tetris.components.grid'
local BagRandomizer = require 'tetris.randomizers.bag7'
local ComboChallenge = GameMode:extend()
ComboChallenge.name = "Combo Challenge"
ComboChallenge.hash = "ComboChallenge"
ComboChallenge.tagline = "Make the highest combo you can in 30 seconds!"
local blk = { skin = "2tie", colour = "A" }
local maps = {
[1] = {
[23] = {blk, blk, nil, nil},
[24] = {blk, nil, nil, nil},
},
[2] = {
[23] = {blk, nil, nil, nil},
[24] = {blk, blk, nil, nil},
},
[3] = {
[23] = {nil, nil, blk, blk},
[24] = {nil, nil, nil, blk},
},
[4] = {
[23] = {nil, nil, nil, blk},
[24] = {nil, nil, blk, blk},
},
[5] = {
[24] = {blk, blk, blk, nil},
},
[6] = {
[24] = {nil, blk, blk, blk},
},
[7] = {
[24] = {blk, blk, nil, blk},
},
[8] = {
[24] = {blk, nil, blk, blk},
}
}
function ComboChallenge:new()
GameMode:new()
self.grid = Grid(4, 24)
self.grid:applyMap(maps[math.random(#maps)])
self.randomizer = BagRandomizer()
self.lock_drop = false
self.lock_hard_drop = false
self.enable_hold = true
self.next_queue_length = 6
self.rta = 0
self.combo = 0
self.max_combo = 0
self.skips = 2
end
function ComboChallenge:getARR() return config.arr end
function ComboChallenge:getARE() return 6 end
function ComboChallenge:getLineARE() return 6 end
function ComboChallenge:getLineClearDelay() return 12 end
function ComboChallenge:getDasLimit() return config.das end
function ComboChallenge:getDasCutDelay() return config.dcd end
-- skip instead of hold
function ComboChallenge:hold(inputs, ruleset, ihs)
if self.skips <= 0 then return end
-- special ihs case
if ihs then
table.remove(self.next_queue, 1)
table.insert(self.next_queue, self:getNextPiece(ruleset))
end
-- skip
self:initializeNextPiece(inputs, ruleset, table.remove(self.next_queue, 1), false)
table.insert(self.next_queue, self:getNextPiece(ruleset))
self.skips = self.skips - 1
if ihs then playSE("ihs")
else playSE("hold") end
self:onHold()
self:onEnterOrHold(inputs, ruleset)
end
function ComboChallenge:advanceOneFrame()
if self.ready_frames == 0 then
self.rta = self.rta + 1
if self.are == 0 then
self.frames = self.frames + 1
if self.frames >= frameTime(0,30) then
self.game_over = true
end
end
end
end
function ComboChallenge:onPieceLock(piece, cleared_row_count)
playSE("lock")
self.skips = math.min(self.skips + 1, 2)
if cleared_row_count > 0 then
self.combo = self.combo + 1
self.max_combo = math.max(self.combo, self.max_combo)
else
self.combo = 0
end
end
function ComboChallenge:drawGrid()
self.grid:draw()
self:drawGhostPiece()
end
function ComboChallenge:getHighscoreData()
return {
combo = self.max_combo
}
end
function ComboChallenge:drawScoringInfo()
love.graphics.setColor(1, 1, 1, 1)
love.graphics.setFont(font_3x5_2)
if config["side_next"] then
love.graphics.printf("NEXT", 240, 72, 40, "left")
else
love.graphics.printf("NEXT", 64, 40, 40, "left")
end
love.graphics.print(
self.das.direction .. " " ..
self.das.frames .. " " ..
strTrueValues(self.prev_inputs) ..
self.drop_bonus
)
love.graphics.print("SKIPS", 200, 120)
love.graphics.print("MAX COMBO", 200, 200)
love.graphics.print("COMBO", 200, 280)
love.graphics.setFont(font_3x5_4)
love.graphics.print(self.skips, 200, 140)
love.graphics.print(self.max_combo, 200, 220)
love.graphics.print(self.combo, 200, 300)
love.graphics.setFont(font_8x11)
love.graphics.setColor(
(
self.frames >= frameTime(0,20) and self.rta % 4 < 2 and not self.game_over
) and {1, 0.3, 0.3, 1} or {1, 1, 1, 1}
)
love.graphics.printf(formatTime(frameTime(0,30) - self.frames), 64, 420, 160, "center")
love.graphics.setColor(1, 1, 1, 1)
end
return ComboChallenge