--- Engine-specific error handling.
-- Noble Engine overrides/supersedes some Playdate SDK behavior. A "bonk" is what happens when your game breaks the engine.
--
-- Most bonks will throw during normal operation, but others ("debug bonks") introduce some execution overhead so are not
-- checked by default.
--
-- @module Noble.Bonk
--
Noble.Bonk = {}
local bonksAreSetup = false
local checkingForBonks = false
local debugBonks = {}
-- You cannot run this directly. Run Noble.new() with __enableDebugBonkChecking as true to enable debug bonk checking.
function Noble.Bonk.enableDebugBonkChecking()
if (bonksAreSetup == false) then
if (Noble.engineInitialized() == false) then
debugBonks.update = playdate.update
debugBonks.pause = playdate.gameWillPause
debugBonks.resume = playdate.gameWillResume
debugBonks.crankDocked = playdate.crankDocked
debugBonks.crankUndocked = playdate.crankUndocked
bonksAreSetup = true
else
error("BONK-BONK: You cannot run this directly. Run Noble.new() with __enableDebugBonkChecking as true.")
end
else
print("BONK-BONK: You have already run Noble.new() with __enableDebugBonkChecking as true, you cannot run this directly.")
end
end
--- Begin checking for debug bonks, on every frame. This introduces needless overhead, so don't do it in a release build.
-- You can only run this if you ran previously `Noble.new()` with `__enableDebugBonkChecking` as true, which you should also not do in a release build.
-- @see Noble.new
function Noble.Bonk.startCheckingDebugBonks()
if (checkingForBonks == false) then
if (bonksAreSetup) then
checkingForBonks = true
else
error("BONK-BONK: You cannot run this unless debug bonk checking is enabled.")
end
end
end
--- Stop checking for debug bonks on every frame.
--
-- NOTE: You can only run this if debug bonk checking is enabled.
function Noble.Bonk.stopCheckingDebugBonks()
if (checkingForBonks) then
if (bonksAreSetup) then
checkingForBonks = false
else
error("BONK-BONK: You cannot run this unless debug bonk checking is enabled.")
end
end
end
--- Disable the ability to check for debug bonks. It frees up some memory. Once you disable debug bonk checking, you cannot re-enable it.
--
-- NOTE: You can only run this if debug bonk checking is enabled.
function Noble.Bonk.disableDebugBonkChecking()
if (bonksAreSetup) then
debugBonks = {}
bonksAreSetup = false
else
error("BONK-BONK: You cannot run this unless debug bonk checking is enabled.")
end
end
--- Are we debug bonk checking for debug bonks?
-- @treturn bool
function Noble.Bonk.checkingDebugBonks()
return checkingForBonks
end
--- Manually check for debug bonks.
-- This method runs every frame when `checkingDebugBonks` is true, but you may call it manually instead.
--
-- NOTE: You can only run this if debug bonk checking is enabled.
function Noble.Bonk.checkDebugBonks()
if (playdate.crankDocked ~= debugBonks.crankDocked) then
error("BONK: Don't manually define playdate.crankDocked(). Create a crankDocked() inside of an inputHandler instead.")
end
if (playdate.crankUndocked ~= debugBonks.crankUndocked) then
error("BONK: Don't manually define playdate.crankUndocked(). Create a crankUndocked() inside of an inputHandler instead.")
end
if (playdate.update ~= debugBonks.update) then
error("BONK: Don't manually define playdate.update(). Put update code in your scenes' update() methods instead.")
end
if (playdate.gameWillPause ~= debugBonks.pause) then
error("BONK: Don't manually define playdate.gameWillPause(). Put pause code in your scenes' pause() methods instead.")
end
if (playdate.gameWillResume ~= debugBonks.resume) then
error("BONK: Don't manually define playdate.gameWillResume(). Put resume code in your scenes' resume() methods instead.")
end
if (Graphics.sprite.getAlwaysRedraw() == false) then
error("BONK: Don't use Graphics.sprite.setAlwaysRedraw(false) unless you know what you're doing...")
end
if (Noble.currentScene.backgroundColor == Graphics.kColorClear) then
error("BONK: Don't set a scene's backgroundColor to Graphics.kColorClear, silly.")
end
end