diff --git a/game/gamemode.lua b/game/gamemode.lua index 6f3d443..ecab69e 100644 --- a/game/gamemode.lua +++ b/game/gamemode.lua @@ -140,7 +140,7 @@ end function GameMode:readGradeHistory() if love.filesystem.getInfo(SAVE_DIR..self.player_name.."_grade_history.sav") then - self.grade_history = bitser.loadLoveFile(SAVE_DIR..self.player_name.."_grade_history.sav") + self.grade_history = FILE.read(SAVE_DIR..self.player_name.."_grade_history.sav") else self.grade_history = {1,2,0,0} end @@ -148,13 +148,13 @@ function GameMode:readGradeHistory() self.starting_grade = self.grade if self.grade > 1 then local temp_grade = copy(self.grade_history); temp_grade[2] = 0 - bitser.dumpLoveFile(SAVE_DIR..self.player_name.."_grade_history.sav", temp_grade) + FILE.write(SAVE_DIR..self.player_name.."_grade_history.sav", temp_grade) end end function GameMode:readHiScores() if love.filesystem.getInfo(HIscoreFILE) then - self.hi_scores = bitser.loadLoveFile(HIscoreFILE) + self.hi_scores = FILE.read(HIscoreFILE) else self.hi_scores = {"TRO",0,"MIT",0,"ROM",0,"ITR",0,"OMI",0} end @@ -220,7 +220,7 @@ function GameMode:updateHiScores() self.hi_scores[score_position] = self.grade_score hiscore_pos = {score_position-1, score_position} end - bitser.dumpLoveFile(HIscoreFILE, self.hi_scores) + FILE.write(HIscoreFILE, self.hi_scores) return hiscore_pos end @@ -684,7 +684,7 @@ function GameMode:onGameOver() self:updateGradeHistory() end hiscore_pos = self:updateHiScores() - bitser.dumpLoveFile(SAVE_DIR..self.player_name.."_grade_history.sav", self.grade_history) + FILE.write(SAVE_DIR..self.player_name.."_grade_history.sav", self.grade_history) self.did_grades = true end self:drawEndScoringInfo() diff --git a/load.lua b/load.lua index b0a2731..7f8315b 100644 --- a/load.lua +++ b/load.lua @@ -1,15 +1,16 @@ --- Bigint library -bigint = require "libs.bigint.bigint" -number_names = require "libs.bigint.named-powers-of-ten" -require "libs.simple-slider" - -- Fonts FONT_tromi = love.graphics.newFont('res/fonts/monofonto rg.otf', 28) FONT_big = love.graphics.newFont('res/fonts/monofonto rg.otf', 56) local font_height = FONT_tromi:getHeight() * 0.5 local font_big_height = FONT_big:getHeight() * 0.5 + +-- Bigint library +bigint = require "libs.bigint.bigint" +number_names = require "libs.bigint.named-powers-of-ten" + -- BUTTON library +require "libs.simple-slider" BUTTON = require "libs.simple-button" BUTTON.setDefaultOption{ draw = function(self) diff --git a/main.lua b/main.lua index 9a074eb..904ce43 100644 --- a/main.lua +++ b/main.lua @@ -2,7 +2,6 @@ if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE")=="1" then LLDEBUGGER=require('lldebugger') LLDEBUGGER.start() end - require 'funcs' DEBUG_showKey = false @@ -36,6 +35,7 @@ end function love.load() math.randomseed(os.time()) + require "modules.file" "binser" require "settings" -- Window stuffs @@ -48,8 +48,8 @@ function love.load() -- Now it's real time to load all stuffs! require "load" -- Most game's resources are loaded in here - require "game.vctrl" -- VCTRL require "modules.scene" + require "game.vctrl" -- VCTRL function SCENE.update() SCENE = SETTINGS.firstTime and InputConfigScene(true) or TitleScene() @@ -367,35 +367,6 @@ function love.errorhandler(msg) local errorCopied = false local enter_fullscreen = SETTINGS and SETTINGS["fullscreen"] or false - -- Render everything again in a canva - love.graphics.origin() - local screenshot_canva, screenshot_canva_scale - local ok, _ = pcall(function() - if love.graphics.getSystemLimits().texturesize >= 1280 then - screenshot_canva = love.graphics.newCanvas(1280, 960) - screenshot_canva_scale = 0.5 - else - error() - end - end) - if not ok then - screenshot_canva = love.graphics.newCanvas(640, 480) - screenshot_canva_scale = 1 - end - - love.graphics.setCanvas(screenshot_canva) - pcall( - function() - love.graphics.origin() - local transformer = love.math.newTransform(0, 0, 0, 2, 2) - love.graphics.replaceTransform(transformer) - SCENE:render() - end - ) - love.graphics.setCanvas() - - love.audio.stop() - -- Handling the error local err={"Error:"..msg} local c=2 @@ -411,7 +382,62 @@ function love.errorhandler(msg) end end print("\n"..table.concat(err,"\n",1,c-2)) - local p = table.concat(err,"\n", 4) + local tracebacks = table.concat(err,"\n", 4) + + if drawText == nil then + pcall(function() + FONT_tromi = love.graphics.newFont('res/fonts/monofonto rg.otf', 20) + require "funcs" + end) + if drawText == nil then + love.window.setMode(640, 480, {resizable = true}) + return function() -- If "funcs" failed to load, we can only return a more simple version of error screen + love.event.pump() + for e, a, b, c in love.event.poll() do + if e == "quit" then return 1 end + end + + love.graphics.origin() + love.graphics.clear() + love.graphics.setColor(1, 1, 1) + love.graphics.setFont(FONT_tromi) + love.graphics.printf( + err[1]:sub(7).."\nTraceback:\n"..tracebacks, + 30, 30, love.graphics.getWidth() - 10, "left" + ) + love.graphics.present() + if love.timer then love.timer.sleep(0.1) end + end + end + end + + -- Try to create a canva + love.graphics.origin() + local screenshot_canva, screenshot_canva_scale + local ok, _ = pcall(function() + if love.graphics.getSystemLimits().texturesize >= 1280 then + screenshot_canva = love.graphics.newCanvas(1280, 960) + screenshot_canva_scale = 0.5 + else + error() + end + end) + if not ok then + screenshot_canva = love.graphics.newCanvas(640, 480) + screenshot_canva_scale = 1 + end + -- Then draw everything again + love.graphics.setCanvas(screenshot_canva) + pcall( + function() + love.graphics.origin() + local transformer = love.math.newTransform(0, 0, 0, 2, 2) + love.graphics.replaceTransform(transformer) + SCENE:render() + end + ) + love.audio.stop() + love.graphics.setCanvas() local function draw() love.graphics.origin() @@ -436,7 +462,7 @@ Space : show/hide screenshot | OK : Quit Copy: copy error info Escape : Quit | Cancel: Go back Show: show/hide screenshot ]], 20, 10, 620, "left") - drawText(err[1]:sub(7).."\nTraceback:"..(errorCopied and " (Copied to clipboard)\n" or "\n")..p, 20, 180, 620, "left") + drawText(err[1]:sub(7).."\nTraceback:"..(errorCopied and " (Copied to clipboard)\n" or "\n")..tracebacks, 20, 180, 620, "left") else love.graphics.setColor(0, 0, 0, 0.8) love.graphics.rectangle("fill", 15, 450, 400, 25, 5, 5) @@ -446,7 +472,7 @@ Escape : Quit | Cancel: Go back Show: show/hide screensh love.graphics.present() end - local fullErrorText = p + local fullErrorText = tracebacks local function copyToClipboard() love.system.setClipboardText(fullErrorText) errorCopied = true diff --git a/modules/file.lua b/modules/file.lua new file mode 100644 index 0000000..9c09db7 --- /dev/null +++ b/modules/file.lua @@ -0,0 +1,41 @@ +local FILE = {} +local binser = require "libs.binser" +local bitser = require "libs.bitser" + +local serializer_used + +function FILE.serialize(data) + if serializer_used == 'bitser' then + return bitser.dumps(data) + else + return binser.serialize(data) + end +end + +function FILE.deserialize(data) + if serializer_used == 'bitser' then + return bitser.loads(data) + else + return binser.deserialize(data)[1] + end +end + +function FILE.read(path) + if love.filesystem.getInfo(path) then + return FILE.deserialize(love.filesystem.read(path)) + else + error("No file: "..path) + end +end + +function FILE.write(path, data) + love.filesystem.write(path, FILE.serialize(data)) +end + +---@param lib_name 'bitser'|'binser' +---Init the FILE module with chosen serializer +return function(lib_name) + assert(lib_name == 'bitser' or lib_name == 'binser', '[lib_name] must be "bitser" or "binser"') + serializer_used = lib_name + _G.FILE = FILE +end \ No newline at end of file diff --git a/scene/name_entry.lua b/scene/name_entry.lua index 369004c..e35aa4d 100644 --- a/scene/name_entry.lua +++ b/scene/name_entry.lua @@ -56,7 +56,7 @@ function NameEntryScene:new() self.entry_pos = 3 end if love.filesystem.getInfo(HIscoreFILE) then - self.hi_scores = bitser.loadLoveFile(HIscoreFILE) + self.hi_scores = FILE.read(HIscoreFILE) else self.hi_scores = {"TRO",0,"MIT",0,"ROM",0,"ITR",0,"OMI",0} end @@ -150,7 +150,7 @@ function NameEntryScene:onInputPress(e) if self.entry_pos == 3 then name = string.lower(self.name_entry[1]..self.name_entry[2]..self.name_entry[3]) if love.filesystem.getInfo((SAVE_DIR..name.."_grade_history.sav")) then - grade_history = bitser.loadLoveFile(SAVE_DIR..name.."_grade_history.sav") + grade_history = FILE.read(SAVE_DIR..name.."_grade_history.sav") self.grade = grade_history[1] self.wins = grade_history[2] self.plays = grade_history[4] diff --git a/settings.lua b/settings.lua index ea49d31..8618e95 100644 --- a/settings.lua +++ b/settings.lua @@ -1,7 +1,7 @@ local bitser = require 'libs.bitser' local fs = love.filesystem -local _settings = fs.read(CONFIG_FILE) ~= nil and bitser.loadLoveFile(CONFIG_FILE) or {} +local _settings = fs.read(CONFIG_FILE) ~= nil and FILE.read(CONFIG_FILE) or {} local _defaultSettings = { firstTime = true, @@ -37,13 +37,13 @@ SETTINGS = setmetatable( __index = function(_, k) if _settings[k] == nil then _settings[k] = _defaultSettings[k] - bitser.dumpLoveFile(CONFIG_FILE,_settings) + FILE.write(CONFIG_FILE,_settings) end return _settings[k] end, __newindex = function(_, k, v) _settings[k] = v - bitser.dumpLoveFile(CONFIG_FILE,_settings) + FILE.write(CONFIG_FILE,_settings) end } ) \ No newline at end of file