2021-06-25 13:20:23 -05:00
|
|
|
require 'funcs'
|
|
|
|
|
|
|
|
local GameMode = require 'tetris.modes.gamemode'
|
|
|
|
local Piece = require 'tetris.components.piece'
|
|
|
|
local Grid = require 'tetris.components.strategygrid'
|
|
|
|
|
|
|
|
local MasterOfBags = require 'tetris.randomizers.masterofbags'
|
|
|
|
|
|
|
|
local StrategyPFGame = GameMode:extend()
|
|
|
|
|
|
|
|
bgm.strategy_pf=
|
|
|
|
{
|
|
|
|
love.audio.newSource("res/bgm/data_jack_2nd_version.s3m", "stream"),
|
2021-07-02 22:01:37 -05:00
|
|
|
love.audio.newSource("res/bgm/omniphil.s3m", "stream"),
|
|
|
|
love.audio.newSource("res/bgm/icefront.s3m", "stream"),
|
2021-06-25 13:20:23 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
StrategyPFGame.name = "Strategy PF"
|
|
|
|
StrategyPFGame.hash = "StrategyPF"
|
|
|
|
StrategyPFGame.tagline = "Work with a limited number of pieces to reach the end!"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function StrategyPFGame:new()
|
|
|
|
StrategyPFGame.super:new()
|
|
|
|
self.grid=Grid(10,24)
|
|
|
|
|
|
|
|
self.roll_frames = 0
|
|
|
|
self.remaining = 50
|
|
|
|
self.used = 0
|
|
|
|
self.bravos = 0
|
|
|
|
self.roll_lines = 0
|
|
|
|
|
|
|
|
self.Gnames = {
|
|
|
|
"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX",
|
|
|
|
"X", "XI", "XII", "XIII", "XIV",
|
|
|
|
"M", "M-I", "M-II", "M-III", "M-IV", "M-V", "M-VI", "M-VII", "M-VIII", "M-IX",
|
|
|
|
"GM"
|
|
|
|
}
|
|
|
|
|
|
|
|
self.randomizer = MasterOfBags()
|
|
|
|
|
|
|
|
self.instant_hard_drop = true
|
|
|
|
self.instant_soft_drop = false
|
|
|
|
self.enable_hard_drop = true
|
|
|
|
self.enable_hold = true
|
|
|
|
self.next_queue_length = 2
|
|
|
|
self.torikan_check = {}
|
|
|
|
self.torikan_penalty = 0
|
|
|
|
|
|
|
|
self.bgmcheck=0
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:getRank()
|
|
|
|
local level=self.level
|
|
|
|
local names=self.Gnames
|
|
|
|
return names[math.floor(level/100) + 1 + math.floor(math.min(30, self.roll_lines)/3) - self.torikan_penalty]
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:getGravity()
|
|
|
|
return 0
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:advanceOneFrame()
|
|
|
|
if self.ready_frames == 0 then
|
|
|
|
self.frames = self.frames + 1
|
|
|
|
end
|
|
|
|
if self.bgmcheck==0 then
|
|
|
|
switchBGM("strategy_pf", 1)
|
|
|
|
self.bgmcheck=1
|
|
|
|
elseif self.bgmcheck==1 then
|
|
|
|
if self.level>980 then
|
|
|
|
fadeoutBGM(180)
|
|
|
|
self.bgmcheck=-1
|
|
|
|
end
|
|
|
|
elseif self.bgmcheck==-1 then
|
|
|
|
if self.level>999 then
|
|
|
|
switchBGM("strategy_pf", 2)
|
|
|
|
self.bgmcheck=2
|
|
|
|
end
|
|
|
|
elseif self.bgmcheck==2 then
|
|
|
|
if self.level>1480 then
|
|
|
|
fadeoutBGM(180)
|
|
|
|
self.bgmcheck=-2
|
|
|
|
end
|
|
|
|
elseif self.bgmcheck==-2 then
|
|
|
|
if self.level>1499 then
|
|
|
|
switchBGM("strategy_pf", 3)
|
|
|
|
self.bgmcheck=3
|
|
|
|
end
|
|
|
|
end
|
|
|
|
processBGMFadeout(1)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:onPieceEnter()
|
|
|
|
if (self.level % 100 ~= 99) and not self.clear and self.frames ~= 0 then
|
|
|
|
self.level = self.level + 1
|
|
|
|
end
|
|
|
|
self.remaining = self.remaining - 1
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:onPieceLock(piece, cleared_row_count)
|
|
|
|
playSE("lock")
|
|
|
|
if self.remaining==0 and (self.clear or cleared_row_count==0) then
|
|
|
|
self.completed=true
|
|
|
|
end
|
|
|
|
if self.level<1500 then
|
|
|
|
self.used = self.used + 1
|
|
|
|
end
|
|
|
|
self.grid:placement()
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:onLineClear(cleared_row_count)
|
|
|
|
if not self.clear then
|
|
|
|
if self.level<1500 then self.remaining = self.remaining + math.ceil(({2, 6, 8, 20})[math.min(4,cleared_row_count)] * (1 - math.min(1000, self.level)/2000)) end
|
|
|
|
local new_level = math.min(self.level + cleared_row_count + math.max(0, (self.remaining - self:getPieceLimit())), 1500)
|
|
|
|
if new_level == 1500 then
|
|
|
|
self.remaining = 100
|
|
|
|
self.clear = true
|
|
|
|
end
|
|
|
|
self.level = new_level
|
|
|
|
if self.level < 1500 then
|
|
|
|
self.remaining = math.min(self.remaining, self:getPieceLimit())
|
|
|
|
end
|
|
|
|
for x=1,6 do
|
|
|
|
if self.level > (899 + x * 100) and not self.torikan_check[x] then
|
|
|
|
if self.used > 70 * math.floor(self.level/100) - 100 then
|
|
|
|
self.level = 900 + 100 * x
|
|
|
|
self.completed = true
|
|
|
|
self.torikan_penalty = 1
|
|
|
|
return
|
|
|
|
end
|
|
|
|
self.torikan_check[x]=true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
self.roll_lines = self.roll_lines + cleared_row_count
|
|
|
|
if self.roll_lines > 29 then
|
|
|
|
self.completed = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:getPieceLimit()
|
|
|
|
return 100 - math.floor(math.min(1000 , self.level)/20)
|
|
|
|
end
|
|
|
|
|
|
|
|
StrategyPFGame.rollOpacityFunction = {}
|
|
|
|
|
|
|
|
for x=1, 26 do
|
|
|
|
StrategyPFGame.rollOpacityFunction[x] = function(age, placements)
|
|
|
|
if placements < 27-x or age < 4 then return 1
|
|
|
|
else return 0 end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function StrategyPFGame:drawGrid()
|
|
|
|
if self.level>999 and not (self.completed or self.game_over) then
|
|
|
|
self.grid:drawInvisible(self.rollOpacityFunction[math.floor(self.level/20)-49], nil, true)
|
|
|
|
else
|
|
|
|
self.grid:draw()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:drawScoringInfo()
|
|
|
|
love.graphics.setColor(1, 1, 1, 1)
|
|
|
|
|
|
|
|
love.graphics.setFont(font_3x5_2)
|
|
|
|
love.graphics.print(
|
|
|
|
self.das.direction .. " " ..
|
|
|
|
self.das.frames .. " " ..
|
|
|
|
strTrueValues(self.prev_inputs)
|
|
|
|
)
|
|
|
|
|
|
|
|
love.graphics.printf("NEXT", 64, 40, 40, "left")
|
|
|
|
love.graphics.printf("GRADE", 240, 120, 40, "left")
|
|
|
|
love.graphics.printf("REMAINING PIECES", 240, 200, 150, "left")
|
|
|
|
love.graphics.printf("LEVEL", 240, 320, 40, "left")
|
|
|
|
love.graphics.printf("PIECES USED", 64, 420, 160, "left")
|
|
|
|
|
|
|
|
if self.bravos > 0 then love.graphics.printf("BRAVO", 300, 120, 40, "left") end
|
|
|
|
|
|
|
|
love.graphics.setFont(font_3x5_3)
|
|
|
|
love.graphics.printf(self:getRank(), 240, 140, 120, "left")
|
|
|
|
if self.level<1500 then
|
|
|
|
if self.remaining<=25 then
|
|
|
|
love.graphics.setColor(1, 1, 0, 1)
|
|
|
|
if self.remaining<=10 then
|
|
|
|
love.graphics.setColor(1, 0, 0, 1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
love.graphics.printf(self.remaining.."/"..self:getPieceLimit(), 240, 220, 80, "left")
|
|
|
|
love.graphics.setColor(1, 1, 1, 1)
|
|
|
|
else
|
|
|
|
love.graphics.printf(self.remaining, 240, 220, 80, "left")
|
|
|
|
end
|
|
|
|
|
|
|
|
love.graphics.printf(self.level, 240, 340, 50, "right")
|
|
|
|
love.graphics.printf(self:getSectionEndLevel(), 240, 370, 50, "right")
|
|
|
|
if self.bravos > 0 then love.graphics.printf(self.bravos, 300, 140, 40, "left") end
|
|
|
|
|
|
|
|
love.graphics.setFont(font_8x11)
|
|
|
|
love.graphics.printf(self.used, 64, 420, 160, "right")
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:getSectionEndLevel()
|
|
|
|
return math.min(1500, math.floor(self.level / 100 + 1) * 100)
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:getBackground()
|
|
|
|
return math.floor(self.level / 100)
|
|
|
|
end
|
|
|
|
|
|
|
|
function StrategyPFGame:getHighscoreData()
|
|
|
|
return {
|
|
|
|
level = self.level,
|
|
|
|
roll_lines = self.roll_lines
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
return StrategyPFGame
|