moonshine = require("libs.moonshine") local bpm = require("libs.lovebpm") local r, g, b = 0,0,0 local random_characters = "" local score = 0 local luminance = 0 local progressBarWidth = 0 local progressBarHeight = 10 local progressBarX = 0 local progressBarY = 590 local musicLength = 0 local progress = 0 local finish = false function love.load() progressBarWidth = love.graphics.getWidth() main_font = love.graphics.newFont("resources/fonts/Shortcake.ttf", 50) score_font = love.graphics.newFont("resources/fonts/dealerplate_california.otf", 30) effect = moonshine(moonshine.effects.filmgrain) .chain(moonshine.effects.vignette) .chain(moonshine.effects.scanlines) .chain(moonshine.effects.chromasep) effect.chromasep.angle = 1 effect.chromasep.radius = 2 effect.scanlines.thickness = .5 effect.scanlines.opacity = .5 loadMusic() end function love.update(dt) music:update() currentTime = music:getTime() if math.floor(currentTime)==math.floor(musicLength) then finish = true end progress = currentTime/musicLength end function love.draw() effect(function () if luminance > 0.5 then love.graphics.setColor(0,0,0) else love.graphics.setColor(1,1,1) end if not finish then draw_game_logic() else draw_final_score() end draw_progress_bar() end) end function love.keypressed(key, scancode, isrepeat) if not finish then if key == random_characters then score = score + 1 else score = score - 1 end else if key == "space" then reset() end end end function draw_game_logic() local text_width = main_font:getWidth(random_characters) local text_height = main_font:getHeight() local width, height = love.graphics.getDimensions() local charX = (width - text_width)/2 local charY = (height - text_height)/2 love.graphics.setFont(score_font) love.graphics.print("Score: "..score, 685, 10) love.graphics.setFont(main_font) love.graphics.setBackgroundColor(r, g, b) love.graphics.printf(random_characters, charX, charY, text_width, "center") end function draw_final_score() local scoreText = "Final Score: "..score local text_width = main_font:getWidth(scoreText) local text_height = main_font:getHeight() local width, height = love.graphics.getDimensions() local scoreX = (width - text_width)/2 local scoreY = (height - text_height)/2 love.graphics.setFont(main_font) love.graphics.printf(scoreText, scoreX, scoreY, text_width, "center") end function draw_progress_bar() love.graphics.setColor(0.5, 0.5, 0.5) love.graphics.rectangle("fill", progressBarX, progressBarY, progressBarWidth, progressBarHeight) love.graphics.setColor(0, 1, 0) love.graphics.rectangle("fill", progressBarX, progressBarY, progressBarWidth * progress, progressBarHeight) end function loadMusic() music = bpm.newTrack() music:load("resources/music/Goth - Sidewalks and Skeletons.mp3") music:on("beat", function(n) if n > 0 then r, g, b = math.random(255)/255, math.random(255)/255, math.random(255)/255 random_characters = random_char() luminance = get_luminance() end end) music:play() musicLength = music:getTotalTime(); end function reset() finish = false score = 0 currentTime = 0 loadMusic() end function random_char() local alphabet = "abcdefghijklmnopqrstuvwxyz" local random_index = math.random(1, #alphabet) return alphabet:sub(random_index, random_index) end function get_luminance() return 0.2126 * r + 0.7152*g + 0.0722*b end