2020-10-10 18:42:56 -05:00
|
|
|
function love.load()
|
2019-05-22 22:57:34 -05:00
|
|
|
math.randomseed(os.time())
|
|
|
|
highscores = {}
|
2020-10-10 20:17:48 -05:00
|
|
|
require "load.rpc"
|
2019-05-22 22:57:34 -05:00
|
|
|
require "load.graphics"
|
|
|
|
require "load.fonts"
|
|
|
|
require "load.sounds"
|
|
|
|
require "load.bgm"
|
|
|
|
require "load.save"
|
|
|
|
loadSave()
|
|
|
|
require "scene"
|
|
|
|
config["side_next"] = false
|
|
|
|
config["reverse_rotate"] = true
|
|
|
|
config["fullscreen"] = false
|
2019-05-29 20:55:01 -05:00
|
|
|
|
|
|
|
love.window.setMode(love.graphics.getWidth(), love.graphics.getHeight(), {resizable = true});
|
|
|
|
|
2020-10-12 15:21:10 -05:00
|
|
|
if not config.gamesettings then config.gamesettings = {} end
|
|
|
|
for _, option in ipairs(GameConfigScene.options) do
|
|
|
|
if not config.gamesettings[option[1]] then
|
|
|
|
config.gamesettings[option[1]] = 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-05-22 22:57:34 -05:00
|
|
|
if not config.input then
|
|
|
|
config.input = {}
|
|
|
|
scene = InputConfigScene()
|
|
|
|
else
|
|
|
|
if config.current_mode then current_mode = config.current_mode end
|
|
|
|
if config.current_ruleset then current_ruleset = config.current_ruleset end
|
|
|
|
scene = TitleScene()
|
|
|
|
end
|
2020-11-02 21:47:58 -06:00
|
|
|
|
|
|
|
game_modes = {}
|
|
|
|
mode_list = love.filesystem.getDirectoryItems("tetris/modes")
|
|
|
|
for i=1,#mode_list do
|
|
|
|
if(mode_list[i] ~= "gamemode.lua" and mode_list[i] ~= "unrefactored_modes") then
|
|
|
|
game_modes[#game_modes+1] = require ("tetris.modes."..string.sub(mode_list[i],1,-5))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
rulesets = {}
|
|
|
|
rule_list = love.filesystem.getDirectoryItems("tetris/rulesets")
|
|
|
|
for i=1,#rule_list do
|
|
|
|
if(rule_list[i] ~= "ruleset.lua" and rule_list[i] ~= "unrefactored_rulesets") then
|
|
|
|
rulesets[#rulesets+1] = require ("tetris.rulesets."..string.sub(rule_list[i],1,-5))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
--sort mode/rule lists
|
|
|
|
local function padnum(d) return ("%03d%s"):format(#d, d) end
|
|
|
|
table.sort(game_modes, function(a,b)
|
|
|
|
return tostring(a.name):gsub("%d+",padnum) < tostring(b.name):gsub("%d+",padnum) end)
|
|
|
|
table.sort(rulesets, function(a,b)
|
|
|
|
return tostring(a.name):gsub("%d+",padnum) < tostring(b.name):gsub("%d+",padnum) end)
|
|
|
|
|
2019-05-22 22:57:34 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
local TARGET_FPS = 60
|
|
|
|
local SAMPLE_SIZE = 60
|
|
|
|
|
|
|
|
local rolling_samples = {}
|
|
|
|
local rolling_total = 0
|
|
|
|
local average_n = 0
|
|
|
|
local frame = 0
|
|
|
|
|
|
|
|
function getSmoothedDt(dt)
|
|
|
|
rolling_total = rolling_total + dt
|
|
|
|
frame = frame + 1
|
|
|
|
if frame > SAMPLE_SIZE then frame = frame - SAMPLE_SIZE end
|
|
|
|
if average_n == SAMPLE_SIZE then
|
|
|
|
rolling_total = rolling_total - rolling_samples[frame]
|
|
|
|
else
|
|
|
|
average_n = average_n + 1
|
|
|
|
end
|
|
|
|
rolling_samples[frame] = dt
|
|
|
|
return rolling_total / average_n
|
|
|
|
end
|
|
|
|
|
|
|
|
local update_time = 0.52
|
|
|
|
|
|
|
|
function love.update(dt)
|
|
|
|
processBGMFadeout(dt)
|
|
|
|
local old_update_time = update_time
|
|
|
|
update_time = update_time + getSmoothedDt(dt) * TARGET_FPS
|
|
|
|
updates = 0
|
|
|
|
while (update_time >= 1.02) do
|
|
|
|
scene:update()
|
|
|
|
updates = updates + 1
|
|
|
|
update_time = update_time - 1
|
|
|
|
end
|
|
|
|
if math.abs(update_time - old_update_time) < 0.02 then
|
|
|
|
update_time = old_update_time
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function love.draw()
|
|
|
|
love.graphics.push()
|
2020-10-09 17:43:22 -05:00
|
|
|
|
2019-05-29 20:55:01 -05:00
|
|
|
-- get offset matrix
|
|
|
|
love.graphics.setDefaultFilter("linear", "nearest")
|
|
|
|
local width = love.graphics.getWidth()
|
|
|
|
local height = love.graphics.getHeight()
|
|
|
|
local scale_factor = math.min(width / 640, height / 480)
|
|
|
|
love.graphics.translate(
|
|
|
|
(width - scale_factor * 640) / 2,
|
|
|
|
(height - scale_factor * 480) / 2
|
|
|
|
)
|
|
|
|
love.graphics.scale(scale_factor)
|
|
|
|
|
2019-05-22 22:57:34 -05:00
|
|
|
scene:render()
|
|
|
|
love.graphics.pop()
|
|
|
|
end
|
|
|
|
|
|
|
|
function love.keypressed(key, scancode, isrepeat)
|
|
|
|
-- global hotkeys
|
|
|
|
if scancode == "f4" then
|
|
|
|
config["fullscreen"] = not config["fullscreen"]
|
|
|
|
love.window.setFullscreen(config["fullscreen"])
|
|
|
|
else
|
|
|
|
scene:onKeyPress({key=key, scancode=scancode, isRepeat=isrepeat})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function love.focus(f)
|
|
|
|
if f then
|
|
|
|
resumeBGM()
|
|
|
|
else
|
|
|
|
pauseBGM()
|
|
|
|
end
|
|
|
|
end
|