diff src/scripts/boot.lua @ 1096:86a44f2bc38f

CRLF to LF
author Bart van Strien <bart.bes+projects@gmail.com>
date Wed, 04 Jul 2012 14:40:24 +0200
parents 80d18db38205
children 9a6a533ac832 7338252337c9
line wrap: on
line diff
--- a/src/scripts/boot.lua	Wed Jul 04 13:54:15 2012 +0200
+++ b/src/scripts/boot.lua	Wed Jul 04 14:40:24 2012 +0200
@@ -1,817 +1,817 @@
---[[
-Copyright (c) 2006-2012 LOVE Development Team
-
-This software is provided 'as-is', without any express or implied
-warranty.  In no event will the authors be held liable for any damages
-arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it
-freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not
-   claim that you wrote the original software. If you use this software
-   in a product, an acknowledgment in the product documentation would be
-   appreciated but is not required.
-2. Altered source versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-3. This notice may not be removed or altered from any source distribution.
---]]
-
--- Make sure love table exists.
-if not love then love = {} end
-
--- Used for setup:
-love.path = {}
-love.arg = {}
-
--- Unparsed arguments:
-argv = {}
-
--- Replace any \ with /.
-function love.path.normalslashes(p)
-	return string.gsub(p, "\\", "/")
-end
-
--- Makes sure there is a slash at the end
--- of a path.
-function love.path.endslash(p)
-	if string.sub(p, string.len(p)-1) ~= "/" then
-		return p .. "/"
-	else
-		return p
-	end
-end
-
--- Checks whether a path is absolute or not.
-function love.path.abs(p)
-
-	local tmp = love.path.normalslashes(p)
-
-	-- Path is absolute if it starts with a "/".
-	if string.find(tmp, "/") == 1 then
-		return true
-	end
-
-	-- Path is absolute if it starts with a
-	-- letter followed by a colon.
-	if string.find(tmp, "%a:") == 1 then
-		return true
-	end
-
-	-- Relative.
-	return false
-
-end
-
--- Converts any path into a full path.
-function love.path.getfull(p)
-
-	if love.path.abs(p) then
-		return love.path.normalslashes(p)
-	end
-
-	local cwd = love.filesystem.getWorkingDirectory()
-	cwd = love.path.normalslashes(cwd)
-	cwd = love.path.endslash(cwd)
-
-	-- Construct a full path.
-	local full = cwd .. love.path.normalslashes(p)
-
-	-- Remove trailing /., if applicable
-	return full:match("(.-)/%.$") or full
-end
-
--- Returns the leaf of a full path.
-function love.path.leaf(p)
-	local a = 1
-	local last = p
-
-	while a do
-		a = string.find(p, "/", a+1)
-
-		if a then
-			last = string.sub(p, a+1)
-		end
-	end
-
-	return last
-end
-
--- Finds the key in the table with the lowest integral index. The lowest
--- will typically the executable, for instance "lua5.1.exe".
-function love.arg.getLow(a)
-	local m = math.huge
-	for k,v in pairs(a) do
-		if k < m then
-			m = k
-		end
-	end
-	return a[m]
-end
-
-love.arg.options = {
-	console = { a = 0 },
-	fused = {a = 0 },
-	game = { a = 1 }
-}
-
-function love.arg.parse_option(m, i)
-	m.set = true
-
-	if m.a > 0 then
-		m.arg = {}
-		for j=i,i+m.a-1 do
-			table.insert(m.arg, arg[j])
-			i = j
-		end
-	end
-
-	return i
-end
-
-function love.arg.parse_options()
-
-	local game
-	local argc = #arg
-
-	for i=1,argc do
-		-- Look for options.
-		local s, e, m = string.find(arg[i], "%-%-(.+)")
-
-		if m and love.arg.options[m] then
-			i = love.arg.parse_option(love.arg.options[m], i+1)
-		elseif not game then
-			game = i
-		end
-	end
-
-	if not love.arg.options.game.set then
-		love.arg.parse_option(love.arg.options.game, game or 0)
-	end
-end
-
-function love.createhandlers()
-
-	-- Standard callback handlers.
-	love.handlers = setmetatable({
-		keypressed = function (b, u)
-			if love.keypressed then love.keypressed(b, u) end
-		end,
-		keyreleased = function (b)
-			if love.keyreleased then love.keyreleased(b) end
-		end,
-		mousepressed = function (x,y,b)
-			if love.mousepressed then love.mousepressed(x,y,b) end
-		end,
-		mousereleased = function (x,y,b)
-			if love.mousereleased then love.mousereleased(x,y,b) end
-		end,
-		joystickpressed = function (j,b)
-			if love.joystickpressed then love.joystickpressed(j,b) end
-		end,
-		joystickreleased = function (j,b)
-			if love.joystickreleased then love.joystickreleased(j,b) end
-		end,
-		focus = function (f)
-			if love.focus then love.focus(f) end
-		end,
-		quit = function ()
-			return
-		end,
-	}, {
-		__index = function(self, name)
-			error("Unknown event: " .. name)
-		end,
-	})
-
-end
-
-local is_fused_game = false
-local no_game_code = false
-
--- This can't be overriden.
-function love.boot()
-
-	-- This is absolutely needed.
-	require("love")
-	require("love.filesystem")
-
-	love.arg.parse_options()
-
-	local o = love.arg.options
-
-	local arg0 = love.arg.getLow(arg)
-	love.filesystem.init(arg0)
-
-	-- Is this one of those fancy "fused" games?
-	local can_has_game = pcall(love.filesystem.setSource, arg0)
-	is_fused_game = can_has_game
-	if love.arg.options.fused.set then
-		is_fused_game = true
-	end
-
-	if not can_has_game and o.game.set and o.game.arg[1] then
-		local nouri = o.game.arg[1]
-		if nouri:sub(1, 7) == "file://" then
-			nouri = nouri:sub(8)
-		end
-		local full_source =  love.path.getfull(nouri)
-		local leaf = love.path.leaf(full_source)
-		love.filesystem.setIdentity(leaf)
-		can_has_game = pcall(love.filesystem.setSource, full_source)
-	end
-
-	if can_has_game and not (love.filesystem.exists("main.lua") or love.filesystem.exists("conf.lua")) then
-		no_game_code = true
-	end
-
-	if not can_has_game then
-		love.nogame()
-	end
-
-end
-
-function love.init()
-
-	-- Create default configuration settings.
-	-- NOTE: Adding a new module to the modules list
-	-- will NOT make it load, see below.
-	local c = {
-		title = "Untitled",
-		author = "Unnamed",
-		version = love._version,
-		screen = {
-			width = 800,
-			height = 600,
-			fullscreen = false,
-			vsync = true,
-			fsaa = 0,
-		},
-		modules = {
-			event = true,
-			keyboard = true,
-			mouse = true,
-			timer = true,
-			joystick = true,
-			image = true,
-			graphics = true,
-			audio = true,
-			physics = true,
-			sound = true,
-			font = true,
-			thread = true,
-		},
-		console = false, -- Only relevant for windows.
-		identity = false,
-		release = false,
-	}
-
-	-- If config file exists, load it and allow it to update config table.
-	if not love.conf and love.filesystem and love.filesystem.exists("conf.lua") then
-		require("conf")
-	end
-
-	-- Yes, conf.lua might not exist, but there are other ways of making
-	-- love.conf appear, so we should check for it anyway.
-	if love.conf then
-		local ok, err = pcall(love.conf, c)
-		if not ok then
-			print(err)
-			-- continue
-		end
-	end
-
-	if c.release then
-		love._release = {
-			title = c.title ~= "Untitled" and c.title or nil,
-			author = c.author ~= "Unnamed" and c.author or nil,
-			url = c.url
-		}
-	end
-
-	if love.arg.options.console.set then
-		c.console = true
-	end
-
-	-- Gets desired modules.
-	for k,v in ipairs{
-		"thread",
-		"timer",
-		"event",
-		"keyboard",
-		"joystick",
-		"mouse",
-		"sound",
-		"audio",
-		"image",
-		"font",
-		"graphics",
-		"physics",
-	} do
-		if c.modules[v] then
-			require("love." .. v)
-		end
-	end
-
-	if love.event then
-		love.createhandlers()
-	end
-
-	-- Setup screen here.
-	if c.screen and c.modules.graphics then
-		if love.graphics.checkMode(c.screen.width, c.screen.height, c.screen.fullscreen) or (c.screen.width == 0 and c.screen.height == 0) then
-			assert(love.graphics.setMode(c.screen.width, c.screen.height, c.screen.fullscreen, c.screen.vsync, c.screen.fsaa), "Could not set screen mode")
-		else
-			error("Could not set screen mode")
-		end
-		love.graphics.setCaption(c.title)
-	end
-
-	-- Our first timestep, because screen creation can take some time
-	if love.timer then
-		love.timer.step()
-	end
-
-	if love.filesystem then
-		love.filesystem.setRelease(c.release and is_fused_game)
-		if c.identity then love.filesystem.setIdentity(c.identity) end
-		if love.filesystem.exists("main.lua") then require("main") end
-	end
-
-	if no_game_code then
-		error("No code to run\nYour game might be packaged incorrectly\nMake sure main.lua is at the top level of the zip")
-	end
-
-	-- Console hack
-	if c.console and love._openConsole then
-		love._openConsole()
-	end
-
-	-- Check the version
-	local compat = false
-	c.version = tostring(c.version)
-	for i, v in ipairs(love._version_compat) do
-		if c.version == v then
-			compat = true
-			break
-		end
-	end
-	if not compat then
-		local major, minor, revision = c.version:match("^(%d+)%.(%d+)%.(%d+)$")
-		if (not major or not minor or not revision) or (major ~= love._version_major and minor ~= love._version_minor) then
-			local msg = "This game was made for a version that is probably incompatible.\n"..
-				"The game might still work, but it is not guaranteed.\n" ..
-				"Furthermore, this means one should not judge this game or the engine if not."
-			print(msg)
-			if love.graphics and love.timer and love.event then
-				love.event.pump()
-				love.graphics.setBackgroundColor(89, 157, 220)
-				love.graphics.clear()
-				love.graphics.print(msg, 70, 70)
-				love.graphics.present()
-				love.graphics.setBackgroundColor(0, 0, 0)
-				love.timer.sleep(3)
-			end
-		end
-	end
-
-end
-
-function love.run()
-
-	math.randomseed(os.time())
-	math.random() math.random()
-
-	if love.load then love.load(arg) end
-
-	local dt = 0
-
-	-- Main loop time.
-	while true do
-		-- Process events.
-		if love.event then
-			love.event.pump()
-			for e,a,b,c,d in love.event.poll() do
-				if e == "quit" then
-					if not love.quit or not love.quit() then
-						if love.audio then
-							love.audio.stop()
-						end
-						return
-					end
-				end
-				love.handlers[e](a,b,c,d)
-			end
-		end
-
-		-- Update dt, as we'll be passing it to update
-		if love.timer then
-			love.timer.step()
-			dt = love.timer.getDelta()
-		end
-
-		-- Call update and draw
-		if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
-		if love.graphics then
-			love.graphics.clear()
-			if love.draw then love.draw() end
-		end
-
-		if love.timer then love.timer.sleep(0.001) end
-		if love.graphics then love.graphics.present() end
-
-	end
-
-end
-
------------------------------------------------------------
--- Default screen.
------------------------------------------------------------
-
-function love.nogame()
-	local pig_png =
-		"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
-		bWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\
-		bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\
-		eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\
-		NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\
-		dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\
-		dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv\
-		IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS\
-		ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD\
-		cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlE\
-		PSJ4bXAuaWlkOjdCQTYxREYxOUQ5RDExRTBBNjY4RTc1NEVEQTU1MERDIiB4bXBNTTpEb2N1bWVu\
-		dElEPSJ4bXAuZGlkOjdCQTYxREYyOUQ5RDExRTBBNjY4RTc1NEVEQTU1MERDIj4gPHhtcE1NOkRl\
-		cml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6N0JBNjFERUY5RDlEMTFFMEE2NjhF\
-		NzU0RURBNTUwREMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0JBNjFERjA5RDlEMTFFMEE2\
-		NjhFNzU0RURBNTUwREMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1l\
-		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\
-		4xkvbY9d6gAAAABJRU5ErkJggg=="
-	local heart_png =
-		"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
-		bWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\
-		bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\
-		eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\
-		NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\
-		dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\
-		dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv\
-		IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS\
-		ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD\
-		cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlE\
-		PSJ4bXAuaWlkOjk3NUYxN0NGOUQ5RDExRTA5MTgyQjc4MkNEQkY5RkI1IiB4bXBNTTpEb2N1bWVu\
-		dElEPSJ4bXAuZGlkOjk3NUYxN0QwOUQ5RDExRTA5MTgyQjc4MkNEQkY5RkI1Ij4gPHhtcE1NOkRl\
-		cml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTc1RjE3Q0Q5RDlEMTFFMDkxODJC\
-		NzgyQ0RCRjlGQjUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTc1RjE3Q0U5RDlEMTFFMDkx\
-		ODJCNzgyQ0RCRjlGQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1l\
-		dGE+IDw/eHBhY2tldCBlbmQ9InIiPz7MtgYTAAACd0lEQVR42uyajW2CUBDHH8YBWKBJR8AJChvY\
-		AZriBNYJrBOIE9imA6gTyAZlg9p0ATaw99IzfSEgvI9DlLvk5UUUuPu9/71PvePxKPpsA9FzYwAM\
-		gAEwAAbAABgAA2AADIABMAAG0EcbmtzkeV7p9Z+nVQhViB8PUNK7j+nBxkF4ZgzVHMp9ydeZfAeU\
-		d3hPVnZ/3X6HZ7IhUgQATgZQraEEJT+XDi7AwVQzcB+qjQK0zuTzJ0Xg5ACw1aWjfs1tCTg30wh+\
-		XwH0nOVQIlUNpACw5fcNglclKx3MCYJXIYxOSqiLb2CRm75m8AKD+kJwVba2CF6gP+s2RoGlZvCq\
-		g/syCHDtFaqxg849hGeNyQDAw2WPHFu20gZVpKbT3OEI90ypgKkDB+9RCScIG8dDfCMFDE0l5shJ\
-		2epLgPBdMc5bGaoqowAQOPQzFnTmU6XAVViTydctA2g0Bb9lAGnfAewoAaQdDz6H/N9SAth1HMCK\
-		eiq87XLry5UnKQBcaXUVwurcatNlJzi79ta3AoAqSDoGYKHT+tYbIjjf/nQ8NTa1DIIfFS+SbYgo\
-		9ojSu7RNTG6yBoCpEF0YwqJqV5g8BQpLT90tMjLpt5kCJyVkqIRDi8HnptInWQsghFHdJoRDm5lK\
-		n2wxhMOQVMIbcfDynMH6Hc76gDKDfuFF/O0eO1/qQvBRkx+21gdUqCHBlHDZL2Q49Dox8v0ApV9I\
-		HAUf6c72LpYCJSkRYkoEbQXfyumwAYhYVB95O235TgIogJjWKCKVOW8q+04DKMwi5UnOg/g/dMlx\
-		imvVd5AAuCXjP0kxAAbAABgAA2AADIABMAAGwAB6ab8CDACjlPepVvE3rwAAAABJRU5ErkJggg=="
-
-	local hearts = {}
-	local rings = {}
-	
-	local cx = 400
-	local cy = 300
-	
-	local pig
-	local heart_image
-	
-	local function add_heart_ring(radius, number, speed)
-		local step = math.pi*2/number
-		for i = 1,number do
-			local heart = {
-				radius = radius,
-				position = step*i,
-				speed = speed,
-				opacity = radius/450
-			}
-			table.insert(hearts, heart)
-		end
-		table.insert(rings, radius)
-	end
-	
-	local function update_hearts(dt)
-		for i,v in ipairs(hearts) do
-			v.position = v.position + v.speed*dt*0.6
-		end
-	end
-	
-	local function draw_hearts()
-		for i,v in ipairs(hearts) do
-			local x = math.cos(v.position) * v.radius + cx
-			local y = math.sin(v.position) * v.radius + cy
-			love.graphics.setColor(255, 255, 255, v.opacity*255)
-			love.graphics.draw(heart_image, x, y, v.position+0.4, 1, 1, 32, 32)
-		end
-	end
-	
-	local function draw_pig(p)
-		love.graphics.setColor(255, 255, 255, 255)
-		love.graphics.draw(p.img, p.x, p.y, 0, 1, 1, 128, 128)
-	end
-
-	local function loadimage(file, name)
-		return love.graphics.newImage(love.image.newImageData(love.filesystem.newFileData(file, name:gsub("_", "."), "base64")))
-	end
-	
-	function love.load()
-		math.randomseed(os.time())
-		pig = {
-			x = cx,
-			y = cy,
-			img = loadimage(pig_png, "pig.png")
-		}
-		heart_image = loadimage(heart_png, "heart.png")
-	
-		add_heart_ring(100, 10, 2.4)
-		add_heart_ring(150, 20, 2.2)
-		add_heart_ring(200, 25, 2.0)
-		add_heart_ring(250, 35, 1.8)
-		add_heart_ring(300, 40, 1.6)
-		add_heart_ring(350, 50, 1.4)
-		add_heart_ring(400, 60, 1.2)
-		add_heart_ring(450, 70, 1)
-	end
-	
-	function love.update(dt)
-		update_hearts(dt)
-	end
-	
-	function love.draw()
-		love.graphics.setBackgroundColor(254, 224, 238)
-		draw_hearts()
-		draw_pig(pig)
-	end
-	
-	function love.keyreleased(key)
-		if key == "escape" then
-			love.event.quit()
-		end
-	end
-
-	function love.conf(t)
-		t.title = "L\195\150VE " .. love._version .. " (" .. love._version_codename .. ")"
-		t.modules.audio = false
-		t.modules.sound = false
-		t.modules.physics = false
-		t.modules.joystick = false
-	end
-end
-
------------------------------------------------------------
--- Error screen.
------------------------------------------------------------
-
-local debug = debug
-
-local function error_printer(msg, layer)
-	print((debug.traceback("Error: " .. tostring(msg), 1+(layer or 1)):gsub("\n[^\n]+$", "")))
-end
-
-function love.errhand(msg)
-	msg = tostring(msg)
-
-	error_printer(msg, 2)
-
-	if not love.graphics or not love.event or not love.graphics.isCreated() then
-		return
-	end
-
-	-- Load.
-	if love.audio then love.audio.stop() end
-	love.graphics.reset()
-	love.graphics.setBackgroundColor(89, 157, 220)
-	local font = love.graphics.newFont(14)
-	love.graphics.setFont(font)
-
-	love.graphics.setColor(255, 255, 255, 255)
-
-	local trace = debug.traceback()
-
-	love.graphics.clear()
-
-	local err = {}
-
-	table.insert(err, "Error\n")
-	table.insert(err, msg.."\n\n")
-
-	for l in string.gmatch(trace, "(.-)\n") do
-		if not string.match(l, "boot.lua") then
-			l = string.gsub(l, "stack traceback:", "Traceback\n")
-			table.insert(err, l)
-		end
-	end
-
-	local p = table.concat(err, "\n")
-
-	p = string.gsub(p, "\t", "")
-	p = string.gsub(p, "%[string \"(.-)\"%]", "%1")
-
-	local function draw()
-		love.graphics.clear()
-		love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70)
-		love.graphics.present()
-	end
-
-	draw()
-
-	local e, a, b, c
-	while true do
-		e, a, b, c = love.event.wait()
-
-		if e == "quit" then
-			return
-		end
-		if e == "keypressed" and a == "escape" then
-			return
-		end
-
-		draw()
-
-	end
-
-end
-
-function love.releaseerrhand(msg)
-	print("An error has occured, the game has been stopped.")
-
-	if not love.graphics or not love.event or not love.graphics.isCreated() then
-		return
-	end
-
-	love.graphics.setCanvas()
-	love.graphics.setPixelEffect()
-
-	-- Load.
-	if love.audio then love.audio.stop() end
-	love.graphics.reset()
-	love.graphics.setBackgroundColor(89, 157, 220)
-	local font = love.graphics.newFont(14)
-	love.graphics.setFont(font)
-
-	love.graphics.setColor(255, 255, 255, 255)
-
-	love.graphics.clear()
-
-	local err = {}
-
-	p = string.format("An error has occured that caused %s to stop.\nYou can notify %s about this%s.", love._release.title or "this game", love._release.author or "the author", love._release.url and " at " .. love._release.url or "")
-
-	local function draw()
-		love.graphics.clear()
-		love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70)
-		love.graphics.present()
-	end
-
-	draw()
-
-	local e, a, b, c
-	while true do
-		e, a, b, c = love.event.wait()
-
-		if e == "quit" then
-			return
-		end
-		if e == "keypressed" and a == "escape" then
-			return
-		end
-
-		draw()
-
-	end
-end
-
-
------------------------------------------------------------
--- The root of all calls.
------------------------------------------------------------
-
-return function()
-	local result = xpcall(love.boot, error_printer)
-	if not result then return 1 end
-	local result = xpcall(love.init, love._release and love.releaseerrhand or love.errhand)
-	if not result then return 1 end
-	local result, retval = xpcall(love.run, love._release and love.releaseerrhand or love.errhand)
-	if not result then return 1 end
-
-	return tonumber(retval) or 0
-end
+--[[
+Copyright (c) 2006-2012 LOVE Development Team
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+--]]
+
+-- Make sure love table exists.
+if not love then love = {} end
+
+-- Used for setup:
+love.path = {}
+love.arg = {}
+
+-- Unparsed arguments:
+argv = {}
+
+-- Replace any \ with /.
+function love.path.normalslashes(p)
+	return string.gsub(p, "\\", "/")
+end
+
+-- Makes sure there is a slash at the end
+-- of a path.
+function love.path.endslash(p)
+	if string.sub(p, string.len(p)-1) ~= "/" then
+		return p .. "/"
+	else
+		return p
+	end
+end
+
+-- Checks whether a path is absolute or not.
+function love.path.abs(p)
+
+	local tmp = love.path.normalslashes(p)
+
+	-- Path is absolute if it starts with a "/".
+	if string.find(tmp, "/") == 1 then
+		return true
+	end
+
+	-- Path is absolute if it starts with a
+	-- letter followed by a colon.
+	if string.find(tmp, "%a:") == 1 then
+		return true
+	end
+
+	-- Relative.
+	return false
+
+end
+
+-- Converts any path into a full path.
+function love.path.getfull(p)
+
+	if love.path.abs(p) then
+		return love.path.normalslashes(p)
+	end
+
+	local cwd = love.filesystem.getWorkingDirectory()
+	cwd = love.path.normalslashes(cwd)
+	cwd = love.path.endslash(cwd)
+
+	-- Construct a full path.
+	local full = cwd .. love.path.normalslashes(p)
+
+	-- Remove trailing /., if applicable
+	return full:match("(.-)/%.$") or full
+end
+
+-- Returns the leaf of a full path.
+function love.path.leaf(p)
+	local a = 1
+	local last = p
+
+	while a do
+		a = string.find(p, "/", a+1)
+
+		if a then
+			last = string.sub(p, a+1)
+		end
+	end
+
+	return last
+end
+
+-- Finds the key in the table with the lowest integral index. The lowest
+-- will typically the executable, for instance "lua5.1.exe".
+function love.arg.getLow(a)
+	local m = math.huge
+	for k,v in pairs(a) do
+		if k < m then
+			m = k
+		end
+	end
+	return a[m]
+end
+
+love.arg.options = {
+	console = { a = 0 },
+	fused = {a = 0 },
+	game = { a = 1 }
+}
+
+function love.arg.parse_option(m, i)
+	m.set = true
+
+	if m.a > 0 then
+		m.arg = {}
+		for j=i,i+m.a-1 do
+			table.insert(m.arg, arg[j])
+			i = j
+		end
+	end
+
+	return i
+end
+
+function love.arg.parse_options()
+
+	local game
+	local argc = #arg
+
+	for i=1,argc do
+		-- Look for options.
+		local s, e, m = string.find(arg[i], "%-%-(.+)")
+
+		if m and love.arg.options[m] then
+			i = love.arg.parse_option(love.arg.options[m], i+1)
+		elseif not game then
+			game = i
+		end
+	end
+
+	if not love.arg.options.game.set then
+		love.arg.parse_option(love.arg.options.game, game or 0)
+	end
+end
+
+function love.createhandlers()
+
+	-- Standard callback handlers.
+	love.handlers = setmetatable({
+		keypressed = function (b, u)
+			if love.keypressed then love.keypressed(b, u) end
+		end,
+		keyreleased = function (b)
+			if love.keyreleased then love.keyreleased(b) end
+		end,
+		mousepressed = function (x,y,b)
+			if love.mousepressed then love.mousepressed(x,y,b) end
+		end,
+		mousereleased = function (x,y,b)
+			if love.mousereleased then love.mousereleased(x,y,b) end
+		end,
+		joystickpressed = function (j,b)
+			if love.joystickpressed then love.joystickpressed(j,b) end
+		end,
+		joystickreleased = function (j,b)
+			if love.joystickreleased then love.joystickreleased(j,b) end
+		end,
+		focus = function (f)
+			if love.focus then love.focus(f) end
+		end,
+		quit = function ()
+			return
+		end,
+	}, {
+		__index = function(self, name)
+			error("Unknown event: " .. name)
+		end,
+	})
+
+end
+
+local is_fused_game = false
+local no_game_code = false
+
+-- This can't be overriden.
+function love.boot()
+
+	-- This is absolutely needed.
+	require("love")
+	require("love.filesystem")
+
+	love.arg.parse_options()
+
+	local o = love.arg.options
+
+	local arg0 = love.arg.getLow(arg)
+	love.filesystem.init(arg0)
+
+	-- Is this one of those fancy "fused" games?
+	local can_has_game = pcall(love.filesystem.setSource, arg0)
+	is_fused_game = can_has_game
+	if love.arg.options.fused.set then
+		is_fused_game = true
+	end
+
+	if not can_has_game and o.game.set and o.game.arg[1] then
+		local nouri = o.game.arg[1]
+		if nouri:sub(1, 7) == "file://" then
+			nouri = nouri:sub(8)
+		end
+		local full_source =  love.path.getfull(nouri)
+		local leaf = love.path.leaf(full_source)
+		love.filesystem.setIdentity(leaf)
+		can_has_game = pcall(love.filesystem.setSource, full_source)
+	end
+
+	if can_has_game and not (love.filesystem.exists("main.lua") or love.filesystem.exists("conf.lua")) then
+		no_game_code = true
+	end
+
+	if not can_has_game then
+		love.nogame()
+	end
+
+end
+
+function love.init()
+
+	-- Create default configuration settings.
+	-- NOTE: Adding a new module to the modules list
+	-- will NOT make it load, see below.
+	local c = {
+		title = "Untitled",
+		author = "Unnamed",
+		version = love._version,
+		screen = {
+			width = 800,
+			height = 600,
+			fullscreen = false,
+			vsync = true,
+			fsaa = 0,
+		},
+		modules = {
+			event = true,
+			keyboard = true,
+			mouse = true,
+			timer = true,
+			joystick = true,
+			image = true,
+			graphics = true,
+			audio = true,
+			physics = true,
+			sound = true,
+			font = true,
+			thread = true,
+		},
+		console = false, -- Only relevant for windows.
+		identity = false,
+		release = false,
+	}
+
+	-- If config file exists, load it and allow it to update config table.
+	if not love.conf and love.filesystem and love.filesystem.exists("conf.lua") then
+		require("conf")
+	end
+
+	-- Yes, conf.lua might not exist, but there are other ways of making
+	-- love.conf appear, so we should check for it anyway.
+	if love.conf then
+		local ok, err = pcall(love.conf, c)
+		if not ok then
+			print(err)
+			-- continue
+		end
+	end
+
+	if c.release then
+		love._release = {
+			title = c.title ~= "Untitled" and c.title or nil,
+			author = c.author ~= "Unnamed" and c.author or nil,
+			url = c.url
+		}
+	end
+
+	if love.arg.options.console.set then
+		c.console = true
+	end
+
+	-- Gets desired modules.
+	for k,v in ipairs{
+		"thread",
+		"timer",
+		"event",
+		"keyboard",
+		"joystick",
+		"mouse",
+		"sound",
+		"audio",
+		"image",
+		"font",
+		"graphics",
+		"physics",
+	} do
+		if c.modules[v] then
+			require("love." .. v)
+		end
+	end
+
+	if love.event then
+		love.createhandlers()
+	end
+
+	-- Setup screen here.
+	if c.screen and c.modules.graphics then
+		if love.graphics.checkMode(c.screen.width, c.screen.height, c.screen.fullscreen) or (c.screen.width == 0 and c.screen.height == 0) then
+			assert(love.graphics.setMode(c.screen.width, c.screen.height, c.screen.fullscreen, c.screen.vsync, c.screen.fsaa), "Could not set screen mode")
+		else
+			error("Could not set screen mode")
+		end
+		love.graphics.setCaption(c.title)
+	end
+
+	-- Our first timestep, because screen creation can take some time
+	if love.timer then
+		love.timer.step()
+	end
+
+	if love.filesystem then
+		love.filesystem.setRelease(c.release and is_fused_game)
+		if c.identity then love.filesystem.setIdentity(c.identity) end
+		if love.filesystem.exists("main.lua") then require("main") end
+	end
+
+	if no_game_code then
+		error("No code to run\nYour game might be packaged incorrectly\nMake sure main.lua is at the top level of the zip")
+	end
+
+	-- Console hack
+	if c.console and love._openConsole then
+		love._openConsole()
+	end
+
+	-- Check the version
+	local compat = false
+	c.version = tostring(c.version)
+	for i, v in ipairs(love._version_compat) do
+		if c.version == v then
+			compat = true
+			break
+		end
+	end
+	if not compat then
+		local major, minor, revision = c.version:match("^(%d+)%.(%d+)%.(%d+)$")
+		if (not major or not minor or not revision) or (major ~= love._version_major and minor ~= love._version_minor) then
+			local msg = "This game was made for a version that is probably incompatible.\n"..
+				"The game might still work, but it is not guaranteed.\n" ..
+				"Furthermore, this means one should not judge this game or the engine if not."
+			print(msg)
+			if love.graphics and love.timer and love.event then
+				love.event.pump()
+				love.graphics.setBackgroundColor(89, 157, 220)
+				love.graphics.clear()
+				love.graphics.print(msg, 70, 70)
+				love.graphics.present()
+				love.graphics.setBackgroundColor(0, 0, 0)
+				love.timer.sleep(3)
+			end
+		end
+	end
+
+end
+
+function love.run()
+
+	math.randomseed(os.time())
+	math.random() math.random()
+
+	if love.load then love.load(arg) end
+
+	local dt = 0
+
+	-- Main loop time.
+	while true do
+		-- Process events.
+		if love.event then
+			love.event.pump()
+			for e,a,b,c,d in love.event.poll() do
+				if e == "quit" then
+					if not love.quit or not love.quit() then
+						if love.audio then
+							love.audio.stop()
+						end
+						return
+					end
+				end
+				love.handlers[e](a,b,c,d)
+			end
+		end
+
+		-- Update dt, as we'll be passing it to update
+		if love.timer then
+			love.timer.step()
+			dt = love.timer.getDelta()
+		end
+
+		-- Call update and draw
+		if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled
+		if love.graphics then
+			love.graphics.clear()
+			if love.draw then love.draw() end
+		end
+
+		if love.timer then love.timer.sleep(0.001) end
+		if love.graphics then love.graphics.present() end
+
+	end
+
+end
+
+-----------------------------------------------------------
+-- Default screen.
+-----------------------------------------------------------
+
+function love.nogame()
+	local pig_png =
+		"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
+		bWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\
+		bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\
+		eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\
+		NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\
+		dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\
+		dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv\
+		IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS\
+		ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD\
+		cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlE\
+		PSJ4bXAuaWlkOjdCQTYxREYxOUQ5RDExRTBBNjY4RTc1NEVEQTU1MERDIiB4bXBNTTpEb2N1bWVu\
+		dElEPSJ4bXAuZGlkOjdCQTYxREYyOUQ5RDExRTBBNjY4RTc1NEVEQTU1MERDIj4gPHhtcE1NOkRl\
+		cml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6N0JBNjFERUY5RDlEMTFFMEE2NjhF\
+		NzU0RURBNTUwREMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6N0JBNjFERjA5RDlEMTFFMEE2\
+		NjhFNzU0RURBNTUwREMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1l\
+		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\
+		4xkvbY9d6gAAAABJRU5ErkJggg=="
+	local heart_png =
+		"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\
+		bWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp\
+		bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6\
+		eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz\
+		NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo\
+		dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw\
+		dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv\
+		IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS\
+		ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD\
+		cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlE\
+		PSJ4bXAuaWlkOjk3NUYxN0NGOUQ5RDExRTA5MTgyQjc4MkNEQkY5RkI1IiB4bXBNTTpEb2N1bWVu\
+		dElEPSJ4bXAuZGlkOjk3NUYxN0QwOUQ5RDExRTA5MTgyQjc4MkNEQkY5RkI1Ij4gPHhtcE1NOkRl\
+		cml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTc1RjE3Q0Q5RDlEMTFFMDkxODJC\
+		NzgyQ0RCRjlGQjUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTc1RjE3Q0U5RDlEMTFFMDkx\
+		ODJCNzgyQ0RCRjlGQjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1l\
+		dGE+IDw/eHBhY2tldCBlbmQ9InIiPz7MtgYTAAACd0lEQVR42uyajW2CUBDHH8YBWKBJR8AJChvY\
+		AZriBNYJrBOIE9imA6gTyAZlg9p0ATaw99IzfSEgvI9DlLvk5UUUuPu9/71PvePxKPpsA9FzYwAM\
+		gAEwAAbAABgAA2AADIABMAAG0EcbmtzkeV7p9Z+nVQhViB8PUNK7j+nBxkF4ZgzVHMp9ydeZfAeU\
+		d3hPVnZ/3X6HZ7IhUgQATgZQraEEJT+XDi7AwVQzcB+qjQK0zuTzJ0Xg5ACw1aWjfs1tCTg30wh+\
+		XwH0nOVQIlUNpACw5fcNglclKx3MCYJXIYxOSqiLb2CRm75m8AKD+kJwVba2CF6gP+s2RoGlZvCq\
+		g/syCHDtFaqxg849hGeNyQDAw2WPHFu20gZVpKbT3OEI90ypgKkDB+9RCScIG8dDfCMFDE0l5shJ\
+		2epLgPBdMc5bGaoqowAQOPQzFnTmU6XAVViTydctA2g0Bb9lAGnfAewoAaQdDz6H/N9SAth1HMCK\
+		eiq87XLry5UnKQBcaXUVwurcatNlJzi79ta3AoAqSDoGYKHT+tYbIjjf/nQ8NTa1DIIfFS+SbYgo\
+		9ojSu7RNTG6yBoCpEF0YwqJqV5g8BQpLT90tMjLpt5kCJyVkqIRDi8HnptInWQsghFHdJoRDm5lK\
+		n2wxhMOQVMIbcfDynMH6Hc76gDKDfuFF/O0eO1/qQvBRkx+21gdUqCHBlHDZL2Q49Dox8v0ApV9I\
+		HAUf6c72LpYCJSkRYkoEbQXfyumwAYhYVB95O235TgIogJjWKCKVOW8q+04DKMwi5UnOg/g/dMlx\
+		imvVd5AAuCXjP0kxAAbAABgAA2AADIABMAAGwAB6ab8CDACjlPepVvE3rwAAAABJRU5ErkJggg=="
+
+	local hearts = {}
+	local rings = {}
+	
+	local cx = 400
+	local cy = 300
+	
+	local pig
+	local heart_image
+	
+	local function add_heart_ring(radius, number, speed)
+		local step = math.pi*2/number
+		for i = 1,number do
+			local heart = {
+				radius = radius,
+				position = step*i,
+				speed = speed,
+				opacity = radius/450
+			}
+			table.insert(hearts, heart)
+		end
+		table.insert(rings, radius)
+	end
+	
+	local function update_hearts(dt)
+		for i,v in ipairs(hearts) do
+			v.position = v.position + v.speed*dt*0.6
+		end
+	end
+	
+	local function draw_hearts()
+		for i,v in ipairs(hearts) do
+			local x = math.cos(v.position) * v.radius + cx
+			local y = math.sin(v.position) * v.radius + cy
+			love.graphics.setColor(255, 255, 255, v.opacity*255)
+			love.graphics.draw(heart_image, x, y, v.position+0.4, 1, 1, 32, 32)
+		end
+	end
+	
+	local function draw_pig(p)
+		love.graphics.setColor(255, 255, 255, 255)
+		love.graphics.draw(p.img, p.x, p.y, 0, 1, 1, 128, 128)
+	end
+
+	local function loadimage(file, name)
+		return love.graphics.newImage(love.image.newImageData(love.filesystem.newFileData(file, name:gsub("_", "."), "base64")))
+	end
+	
+	function love.load()
+		math.randomseed(os.time())
+		pig = {
+			x = cx,
+			y = cy,
+			img = loadimage(pig_png, "pig.png")
+		}
+		heart_image = loadimage(heart_png, "heart.png")
+	
+		add_heart_ring(100, 10, 2.4)
+		add_heart_ring(150, 20, 2.2)
+		add_heart_ring(200, 25, 2.0)
+		add_heart_ring(250, 35, 1.8)
+		add_heart_ring(300, 40, 1.6)
+		add_heart_ring(350, 50, 1.4)
+		add_heart_ring(400, 60, 1.2)
+		add_heart_ring(450, 70, 1)
+	end
+	
+	function love.update(dt)
+		update_hearts(dt)
+	end
+	
+	function love.draw()
+		love.graphics.setBackgroundColor(254, 224, 238)
+		draw_hearts()
+		draw_pig(pig)
+	end
+	
+	function love.keyreleased(key)
+		if key == "escape" then
+			love.event.quit()
+		end
+	end
+
+	function love.conf(t)
+		t.title = "L\195\150VE " .. love._version .. " (" .. love._version_codename .. ")"
+		t.modules.audio = false
+		t.modules.sound = false
+		t.modules.physics = false
+		t.modules.joystick = false
+	end
+end
+
+-----------------------------------------------------------
+-- Error screen.
+-----------------------------------------------------------
+
+local debug = debug
+
+local function error_printer(msg, layer)
+	print((debug.traceback("Error: " .. tostring(msg), 1+(layer or 1)):gsub("\n[^\n]+$", "")))
+end
+
+function love.errhand(msg)
+	msg = tostring(msg)
+
+	error_printer(msg, 2)
+
+	if not love.graphics or not love.event or not love.graphics.isCreated() then
+		return
+	end
+
+	-- Load.
+	if love.audio then love.audio.stop() end
+	love.graphics.reset()
+	love.graphics.setBackgroundColor(89, 157, 220)
+	local font = love.graphics.newFont(14)
+	love.graphics.setFont(font)
+
+	love.graphics.setColor(255, 255, 255, 255)
+
+	local trace = debug.traceback()
+
+	love.graphics.clear()
+
+	local err = {}
+
+	table.insert(err, "Error\n")
+	table.insert(err, msg.."\n\n")
+
+	for l in string.gmatch(trace, "(.-)\n") do
+		if not string.match(l, "boot.lua") then
+			l = string.gsub(l, "stack traceback:", "Traceback\n")
+			table.insert(err, l)
+		end
+	end
+
+	local p = table.concat(err, "\n")
+
+	p = string.gsub(p, "\t", "")
+	p = string.gsub(p, "%[string \"(.-)\"%]", "%1")
+
+	local function draw()
+		love.graphics.clear()
+		love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70)
+		love.graphics.present()
+	end
+
+	draw()
+
+	local e, a, b, c
+	while true do
+		e, a, b, c = love.event.wait()
+
+		if e == "quit" then
+			return
+		end
+		if e == "keypressed" and a == "escape" then
+			return
+		end
+
+		draw()
+
+	end
+
+end
+
+function love.releaseerrhand(msg)
+	print("An error has occured, the game has been stopped.")
+
+	if not love.graphics or not love.event or not love.graphics.isCreated() then
+		return
+	end
+
+	love.graphics.setCanvas()
+	love.graphics.setPixelEffect()
+
+	-- Load.
+	if love.audio then love.audio.stop() end
+	love.graphics.reset()
+	love.graphics.setBackgroundColor(89, 157, 220)
+	local font = love.graphics.newFont(14)
+	love.graphics.setFont(font)
+
+	love.graphics.setColor(255, 255, 255, 255)
+
+	love.graphics.clear()
+
+	local err = {}
+
+	p = string.format("An error has occured that caused %s to stop.\nYou can notify %s about this%s.", love._release.title or "this game", love._release.author or "the author", love._release.url and " at " .. love._release.url or "")
+
+	local function draw()
+		love.graphics.clear()
+		love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70)
+		love.graphics.present()
+	end
+
+	draw()
+
+	local e, a, b, c
+	while true do
+		e, a, b, c = love.event.wait()
+
+		if e == "quit" then
+			return
+		end
+		if e == "keypressed" and a == "escape" then
+			return
+		end
+
+		draw()
+
+	end
+end
+
+
+-----------------------------------------------------------
+-- The root of all calls.
+-----------------------------------------------------------
+
+return function()
+	local result = xpcall(love.boot, error_printer)
+	if not result then return 1 end
+	local result = xpcall(love.init, love._release and love.releaseerrhand or love.errhand)
+	if not result then return 1 end
+	local result, retval = xpcall(love.run, love._release and love.releaseerrhand or love.errhand)
+	if not result then return 1 end
+
+	return tonumber(retval) or 0
+end